<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>1. 生成Fabric证书 | AJ</title>
    <meta name="generator" content="VuePress 1.5.0">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <script>
            var _hmt = _hmt || [];
            (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?51b8c2e72d1adf96524638ce85bb7d72";
            var s = document.getElementsByTagName("script")[0]; 
            s.parentNode.insertBefore(hm, s);

            // 引入谷歌,不需要可删除这段
            var hm1 = document.createElement("script");
            hm1.src = "https://www.googletagmanager.com/gtag/js?id=G-B7351EYS04";
            var s1 = document.getElementsByTagName("script")[0]; 
            s1.parentNode.insertBefore(hm1, s1);
            })();

            // 谷歌加载,不需要可删除
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());

            gtag('config', 'G-B7351EYS04');
        </script>
    <meta name="description" content="阿俊博客|记录一个程序员的成长历程 阿俊博客(blog.zhequtao.com)记录一个后端程序员的成长历程,分享他的学习笔记和心得,还有些开发必备技巧哦! java golang web html dev开发">
    <link rel="preload" href="/assets/css/0.styles.a3df589e.css" as="style"><link rel="preload" href="/assets/js/app.cb35c8f6.js" as="script"><link rel="preload" href="/assets/js/2.063846a6.js" as="script"><link rel="preload" href="/assets/js/4.1ffb4609.js" as="script"><link rel="preload" href="/assets/js/50.9df07553.js" as="script"><link rel="prefetch" href="/assets/js/10.5629fe4d.js"><link rel="prefetch" href="/assets/js/100.8417ccea.js"><link rel="prefetch" href="/assets/js/101.37fdb377.js"><link rel="prefetch" href="/assets/js/102.848b686d.js"><link rel="prefetch" href="/assets/js/103.6a2489a0.js"><link rel="prefetch" href="/assets/js/104.99e8899f.js"><link rel="prefetch" href="/assets/js/105.8b741763.js"><link rel="prefetch" href="/assets/js/106.08163715.js"><link rel="prefetch" href="/assets/js/107.21801349.js"><link rel="prefetch" href="/assets/js/108.e3a2892b.js"><link rel="prefetch" href="/assets/js/109.dab5618c.js"><link rel="prefetch" href="/assets/js/11.cddc1623.js"><link rel="prefetch" href="/assets/js/110.f5249b39.js"><link rel="prefetch" href="/assets/js/111.9abf8bce.js"><link rel="prefetch" href="/assets/js/112.8eb86924.js"><link rel="prefetch" href="/assets/js/113.c180ed46.js"><link rel="prefetch" href="/assets/js/114.2370f5b5.js"><link rel="prefetch" href="/assets/js/115.88dc3fd8.js"><link rel="prefetch" href="/assets/js/116.63403600.js"><link rel="prefetch" href="/assets/js/117.83674aa0.js"><link rel="prefetch" href="/assets/js/118.9c58c685.js"><link rel="prefetch" href="/assets/js/119.621f9a70.js"><link rel="prefetch" href="/assets/js/12.ff3d03f5.js"><link rel="prefetch" href="/assets/js/120.a6d2b7f7.js"><link rel="prefetch" href="/assets/js/121.ae0ce9d1.js"><link rel="prefetch" href="/assets/js/122.de240e6d.js"><link rel="prefetch" href="/assets/js/123.b043e3e4.js"><link rel="prefetch" href="/assets/js/124.550af937.js"><link rel="prefetch" href="/assets/js/125.6f06b34c.js"><link rel="prefetch" href="/assets/js/126.38d64604.js"><link rel="prefetch" href="/assets/js/127.a948db56.js"><link rel="prefetch" href="/assets/js/128.4ca789e0.js"><link rel="prefetch" href="/assets/js/129.59be4505.js"><link rel="prefetch" href="/assets/js/13.e9f75cc3.js"><link rel="prefetch" href="/assets/js/130.ddae76a9.js"><link rel="prefetch" href="/assets/js/131.d969c265.js"><link rel="prefetch" href="/assets/js/132.5f43ce5c.js"><link rel="prefetch" href="/assets/js/133.b651af22.js"><link rel="prefetch" href="/assets/js/134.2499236a.js"><link rel="prefetch" href="/assets/js/135.4180596c.js"><link rel="prefetch" href="/assets/js/136.2c309233.js"><link rel="prefetch" href="/assets/js/137.72ca42dd.js"><link rel="prefetch" href="/assets/js/138.3772cd38.js"><link rel="prefetch" href="/assets/js/139.1d0a53da.js"><link rel="prefetch" href="/assets/js/14.be4b89ed.js"><link rel="prefetch" href="/assets/js/140.22368353.js"><link rel="prefetch" href="/assets/js/141.a14aef3c.js"><link rel="prefetch" href="/assets/js/142.2041ce3a.js"><link rel="prefetch" href="/assets/js/143.377262ec.js"><link rel="prefetch" href="/assets/js/144.8fcbc368.js"><link rel="prefetch" href="/assets/js/145.46da36bf.js"><link rel="prefetch" href="/assets/js/146.eceae0d9.js"><link rel="prefetch" href="/assets/js/147.e1bd6531.js"><link rel="prefetch" href="/assets/js/148.76f193ce.js"><link rel="prefetch" href="/assets/js/149.587bd581.js"><link rel="prefetch" href="/assets/js/15.e3219ac0.js"><link rel="prefetch" href="/assets/js/150.169c71e0.js"><link rel="prefetch" href="/assets/js/151.384021ea.js"><link rel="prefetch" href="/assets/js/152.0f20cf03.js"><link rel="prefetch" href="/assets/js/153.fd94af1e.js"><link rel="prefetch" href="/assets/js/154.a550f5dc.js"><link rel="prefetch" href="/assets/js/155.ba1ae86e.js"><link rel="prefetch" href="/assets/js/156.3b98ded0.js"><link rel="prefetch" href="/assets/js/157.cd378596.js"><link rel="prefetch" href="/assets/js/158.c138d0df.js"><link rel="prefetch" href="/assets/js/159.2635f7f4.js"><link rel="prefetch" href="/assets/js/16.c9c35d42.js"><link rel="prefetch" href="/assets/js/160.d51b4126.js"><link rel="prefetch" href="/assets/js/161.5dc29e7b.js"><link rel="prefetch" href="/assets/js/162.f257a92b.js"><link rel="prefetch" href="/assets/js/163.9eb75e40.js"><link rel="prefetch" href="/assets/js/164.8fb1e22b.js"><link rel="prefetch" href="/assets/js/165.49255503.js"><link rel="prefetch" href="/assets/js/166.e54539e6.js"><link rel="prefetch" href="/assets/js/167.a06acdb0.js"><link rel="prefetch" href="/assets/js/168.948ab620.js"><link rel="prefetch" href="/assets/js/169.7d756812.js"><link rel="prefetch" href="/assets/js/17.81067bc8.js"><link rel="prefetch" href="/assets/js/170.ffe63330.js"><link rel="prefetch" href="/assets/js/171.835398b9.js"><link rel="prefetch" href="/assets/js/172.3987be39.js"><link rel="prefetch" href="/assets/js/173.e3cedb8a.js"><link rel="prefetch" href="/assets/js/174.11a32588.js"><link rel="prefetch" href="/assets/js/175.da6f9782.js"><link rel="prefetch" href="/assets/js/176.50e55edc.js"><link rel="prefetch" href="/assets/js/177.a89a1d17.js"><link rel="prefetch" href="/assets/js/178.7ad3ce84.js"><link rel="prefetch" href="/assets/js/179.98a1343b.js"><link rel="prefetch" href="/assets/js/18.b67caf4c.js"><link rel="prefetch" href="/assets/js/180.4e98599b.js"><link rel="prefetch" href="/assets/js/181.dd885afd.js"><link rel="prefetch" href="/assets/js/182.789990c8.js"><link rel="prefetch" href="/assets/js/183.f11ca2fd.js"><link rel="prefetch" href="/assets/js/184.fcf128ec.js"><link rel="prefetch" href="/assets/js/185.54e1e9b6.js"><link rel="prefetch" href="/assets/js/186.db91021a.js"><link rel="prefetch" href="/assets/js/187.5309dd42.js"><link rel="prefetch" href="/assets/js/188.615821ea.js"><link rel="prefetch" href="/assets/js/189.f23f1d42.js"><link rel="prefetch" href="/assets/js/19.294a011c.js"><link rel="prefetch" href="/assets/js/190.efe894bc.js"><link rel="prefetch" href="/assets/js/191.0d14904a.js"><link rel="prefetch" href="/assets/js/192.efd25a9e.js"><link rel="prefetch" href="/assets/js/193.88151f34.js"><link rel="prefetch" href="/assets/js/194.efedce14.js"><link rel="prefetch" href="/assets/js/195.03ac15bb.js"><link rel="prefetch" href="/assets/js/196.fbc18389.js"><link rel="prefetch" href="/assets/js/197.0257ab5e.js"><link rel="prefetch" href="/assets/js/198.f1de2817.js"><link rel="prefetch" href="/assets/js/199.8f1c166b.js"><link rel="prefetch" href="/assets/js/20.1a41edb1.js"><link rel="prefetch" href="/assets/js/200.4af99727.js"><link rel="prefetch" href="/assets/js/201.9f8caef1.js"><link rel="prefetch" href="/assets/js/202.6f07d705.js"><link rel="prefetch" href="/assets/js/203.5012fe50.js"><link rel="prefetch" href="/assets/js/204.3a0dfd8e.js"><link rel="prefetch" href="/assets/js/205.0ba9b606.js"><link rel="prefetch" href="/assets/js/206.663a49ec.js"><link rel="prefetch" href="/assets/js/207.b2406149.js"><link rel="prefetch" href="/assets/js/208.b0b2dfd8.js"><link rel="prefetch" href="/assets/js/209.41a0ec9f.js"><link rel="prefetch" href="/assets/js/21.b6ea6f9a.js"><link rel="prefetch" href="/assets/js/210.6f36beb8.js"><link rel="prefetch" href="/assets/js/211.90ef6e5c.js"><link rel="prefetch" href="/assets/js/212.42339063.js"><link rel="prefetch" href="/assets/js/213.a2bfeda9.js"><link rel="prefetch" href="/assets/js/214.5c7eb42a.js"><link rel="prefetch" href="/assets/js/215.18260ae5.js"><link rel="prefetch" href="/assets/js/216.7678fd29.js"><link rel="prefetch" href="/assets/js/217.9d936f88.js"><link rel="prefetch" href="/assets/js/218.bac403c4.js"><link rel="prefetch" href="/assets/js/219.9d8cb16b.js"><link rel="prefetch" href="/assets/js/22.367cc253.js"><link rel="prefetch" href="/assets/js/220.375b7707.js"><link rel="prefetch" href="/assets/js/221.3e400da4.js"><link rel="prefetch" href="/assets/js/222.8fbd2857.js"><link rel="prefetch" href="/assets/js/223.76a10075.js"><link rel="prefetch" href="/assets/js/224.ff94cc4e.js"><link rel="prefetch" href="/assets/js/225.d4688ca6.js"><link rel="prefetch" href="/assets/js/226.b13b18af.js"><link rel="prefetch" href="/assets/js/227.288d0f96.js"><link rel="prefetch" href="/assets/js/228.60430ac0.js"><link rel="prefetch" href="/assets/js/229.da728342.js"><link rel="prefetch" href="/assets/js/23.bc3de730.js"><link rel="prefetch" href="/assets/js/230.d8417d20.js"><link rel="prefetch" href="/assets/js/231.6a9ce0b4.js"><link rel="prefetch" href="/assets/js/232.7611b413.js"><link rel="prefetch" href="/assets/js/233.94712cf9.js"><link rel="prefetch" href="/assets/js/234.93888298.js"><link rel="prefetch" href="/assets/js/235.62506981.js"><link rel="prefetch" href="/assets/js/236.5a055c7c.js"><link rel="prefetch" href="/assets/js/237.0a6c4902.js"><link rel="prefetch" href="/assets/js/238.e5f37663.js"><link rel="prefetch" href="/assets/js/239.331bba86.js"><link rel="prefetch" href="/assets/js/24.82f0901c.js"><link rel="prefetch" href="/assets/js/240.59591cfc.js"><link rel="prefetch" href="/assets/js/241.ce671f47.js"><link rel="prefetch" href="/assets/js/242.fb2542fa.js"><link rel="prefetch" href="/assets/js/243.74abc73d.js"><link rel="prefetch" href="/assets/js/244.ecd707b2.js"><link rel="prefetch" href="/assets/js/245.d728367b.js"><link rel="prefetch" href="/assets/js/246.9270e7fe.js"><link rel="prefetch" href="/assets/js/247.a421ba15.js"><link rel="prefetch" href="/assets/js/248.e759132e.js"><link rel="prefetch" href="/assets/js/249.3077fb46.js"><link rel="prefetch" href="/assets/js/25.95c551dc.js"><link rel="prefetch" href="/assets/js/250.5fe4dd03.js"><link rel="prefetch" href="/assets/js/251.4b8fe76c.js"><link rel="prefetch" href="/assets/js/252.0d1cf7ea.js"><link rel="prefetch" href="/assets/js/253.89d16ba0.js"><link rel="prefetch" href="/assets/js/254.8d1afc68.js"><link rel="prefetch" href="/assets/js/255.64e680cb.js"><link rel="prefetch" href="/assets/js/256.9defbd0e.js"><link rel="prefetch" href="/assets/js/257.1fef24fd.js"><link rel="prefetch" href="/assets/js/258.4e205286.js"><link rel="prefetch" href="/assets/js/259.f3d56efc.js"><link rel="prefetch" href="/assets/js/26.7fe56bac.js"><link rel="prefetch" href="/assets/js/260.378299e6.js"><link rel="prefetch" href="/assets/js/261.8e4fb397.js"><link rel="prefetch" href="/assets/js/262.54595d98.js"><link rel="prefetch" href="/assets/js/263.fb333dc1.js"><link rel="prefetch" href="/assets/js/264.13d13301.js"><link rel="prefetch" href="/assets/js/265.c85104bc.js"><link rel="prefetch" href="/assets/js/266.9f3d1f1c.js"><link rel="prefetch" href="/assets/js/267.fb392815.js"><link rel="prefetch" href="/assets/js/268.add7eacb.js"><link rel="prefetch" href="/assets/js/269.7e49fcc7.js"><link rel="prefetch" href="/assets/js/27.5547e5f0.js"><link rel="prefetch" href="/assets/js/270.22342070.js"><link rel="prefetch" href="/assets/js/271.59917b1a.js"><link rel="prefetch" href="/assets/js/272.4a4751d5.js"><link rel="prefetch" href="/assets/js/273.f4c2fa5c.js"><link rel="prefetch" href="/assets/js/274.1208bc94.js"><link rel="prefetch" href="/assets/js/275.f6528753.js"><link rel="prefetch" href="/assets/js/276.a68772cd.js"><link rel="prefetch" href="/assets/js/277.f154ab32.js"><link rel="prefetch" href="/assets/js/278.bb616a63.js"><link rel="prefetch" href="/assets/js/279.6a356cff.js"><link rel="prefetch" href="/assets/js/28.b08b2847.js"><link rel="prefetch" href="/assets/js/280.5afc20fc.js"><link rel="prefetch" href="/assets/js/281.3cd86225.js"><link rel="prefetch" href="/assets/js/282.3ecb92aa.js"><link rel="prefetch" href="/assets/js/283.85159ea7.js"><link rel="prefetch" href="/assets/js/284.b6545c68.js"><link rel="prefetch" href="/assets/js/285.5e83ee29.js"><link rel="prefetch" href="/assets/js/286.2aad298d.js"><link rel="prefetch" href="/assets/js/287.3ca76244.js"><link rel="prefetch" href="/assets/js/288.5b17963d.js"><link rel="prefetch" href="/assets/js/289.f47a759b.js"><link rel="prefetch" href="/assets/js/29.562dbf7d.js"><link rel="prefetch" href="/assets/js/290.36b603c7.js"><link rel="prefetch" href="/assets/js/291.a9bd8951.js"><link rel="prefetch" href="/assets/js/292.dfc54f28.js"><link rel="prefetch" href="/assets/js/293.2d061212.js"><link rel="prefetch" href="/assets/js/294.6d564a9e.js"><link rel="prefetch" href="/assets/js/295.a31dd593.js"><link rel="prefetch" href="/assets/js/296.3101e5e8.js"><link rel="prefetch" href="/assets/js/297.7efde936.js"><link rel="prefetch" href="/assets/js/298.8bb3aa68.js"><link rel="prefetch" href="/assets/js/299.8b51e6bd.js"><link rel="prefetch" href="/assets/js/3.76257eb7.js"><link rel="prefetch" href="/assets/js/30.221adea2.js"><link rel="prefetch" href="/assets/js/300.62effe45.js"><link rel="prefetch" href="/assets/js/301.98c863c5.js"><link rel="prefetch" href="/assets/js/302.e3493ab2.js"><link rel="prefetch" href="/assets/js/303.800c8028.js"><link rel="prefetch" href="/assets/js/304.b6f08986.js"><link rel="prefetch" href="/assets/js/305.09af356b.js"><link rel="prefetch" href="/assets/js/306.d0d3589d.js"><link rel="prefetch" href="/assets/js/307.ee2fd249.js"><link rel="prefetch" href="/assets/js/308.f3f76368.js"><link rel="prefetch" href="/assets/js/309.d2b5ce40.js"><link rel="prefetch" href="/assets/js/31.334fc8bb.js"><link rel="prefetch" href="/assets/js/310.b4fa2feb.js"><link rel="prefetch" href="/assets/js/311.7d747ef3.js"><link rel="prefetch" href="/assets/js/312.89bdff40.js"><link rel="prefetch" href="/assets/js/313.875b82fe.js"><link rel="prefetch" href="/assets/js/314.0bbe51c4.js"><link rel="prefetch" href="/assets/js/315.cc07dbcf.js"><link rel="prefetch" href="/assets/js/316.bc72b152.js"><link rel="prefetch" href="/assets/js/317.55462812.js"><link rel="prefetch" href="/assets/js/318.a158fda0.js"><link rel="prefetch" href="/assets/js/319.b03a5bd2.js"><link rel="prefetch" href="/assets/js/32.d6826b16.js"><link rel="prefetch" href="/assets/js/320.a5bd19b0.js"><link rel="prefetch" href="/assets/js/321.4f9faaa7.js"><link rel="prefetch" href="/assets/js/322.dbd3b4fa.js"><link rel="prefetch" href="/assets/js/323.a04e2062.js"><link rel="prefetch" href="/assets/js/324.c45b46cf.js"><link rel="prefetch" href="/assets/js/325.cd1460c4.js"><link rel="prefetch" href="/assets/js/326.bd90ef85.js"><link rel="prefetch" href="/assets/js/327.8bf38ef7.js"><link rel="prefetch" href="/assets/js/328.99e9aed3.js"><link rel="prefetch" href="/assets/js/329.de0012cb.js"><link rel="prefetch" href="/assets/js/33.b1059062.js"><link rel="prefetch" href="/assets/js/330.59f11391.js"><link rel="prefetch" href="/assets/js/331.6d16a13c.js"><link rel="prefetch" href="/assets/js/332.922ca235.js"><link rel="prefetch" href="/assets/js/333.c94c3602.js"><link rel="prefetch" href="/assets/js/334.77e02010.js"><link rel="prefetch" href="/assets/js/335.1e0c4f7b.js"><link rel="prefetch" href="/assets/js/336.5675dc4f.js"><link rel="prefetch" href="/assets/js/337.bb6e11dc.js"><link rel="prefetch" href="/assets/js/338.294981e9.js"><link rel="prefetch" href="/assets/js/339.d0376372.js"><link rel="prefetch" href="/assets/js/34.0c7d5782.js"><link rel="prefetch" href="/assets/js/340.64596428.js"><link rel="prefetch" href="/assets/js/341.ec0f9409.js"><link rel="prefetch" href="/assets/js/342.7abc47c4.js"><link rel="prefetch" href="/assets/js/343.4262d486.js"><link rel="prefetch" href="/assets/js/344.8729ad8c.js"><link rel="prefetch" href="/assets/js/345.c210d888.js"><link rel="prefetch" href="/assets/js/346.6f42f7cb.js"><link rel="prefetch" href="/assets/js/347.81b41ae5.js"><link rel="prefetch" href="/assets/js/348.07eca37c.js"><link rel="prefetch" href="/assets/js/349.8019d6f3.js"><link rel="prefetch" href="/assets/js/35.ae14e37f.js"><link rel="prefetch" href="/assets/js/350.57da2e7b.js"><link rel="prefetch" href="/assets/js/351.2e99afdf.js"><link rel="prefetch" href="/assets/js/352.67dd88b7.js"><link rel="prefetch" href="/assets/js/353.15b9f624.js"><link rel="prefetch" href="/assets/js/354.a63e8432.js"><link rel="prefetch" href="/assets/js/355.bbc16ee9.js"><link rel="prefetch" href="/assets/js/356.ff63d3bb.js"><link rel="prefetch" href="/assets/js/357.4fb2d941.js"><link rel="prefetch" href="/assets/js/358.55182977.js"><link rel="prefetch" href="/assets/js/359.265c3d26.js"><link rel="prefetch" href="/assets/js/36.b9ed4cf1.js"><link rel="prefetch" href="/assets/js/360.ced80eb3.js"><link rel="prefetch" href="/assets/js/361.afe6ba84.js"><link rel="prefetch" href="/assets/js/362.c2b62518.js"><link rel="prefetch" href="/assets/js/363.0c4a4800.js"><link rel="prefetch" href="/assets/js/364.ce60291b.js"><link rel="prefetch" href="/assets/js/365.0e3a61f9.js"><link rel="prefetch" href="/assets/js/366.d53ccb03.js"><link rel="prefetch" href="/assets/js/367.689e464d.js"><link rel="prefetch" href="/assets/js/368.418c571f.js"><link rel="prefetch" href="/assets/js/369.c2fff3c8.js"><link rel="prefetch" href="/assets/js/37.a021ac57.js"><link rel="prefetch" href="/assets/js/370.a932b958.js"><link rel="prefetch" href="/assets/js/371.7d153241.js"><link rel="prefetch" href="/assets/js/372.fb9878fa.js"><link rel="prefetch" href="/assets/js/373.85772e03.js"><link rel="prefetch" href="/assets/js/374.b4a8b1b6.js"><link rel="prefetch" href="/assets/js/375.32f70596.js"><link rel="prefetch" href="/assets/js/376.a16d79a8.js"><link rel="prefetch" href="/assets/js/377.c996b7e1.js"><link rel="prefetch" href="/assets/js/378.d37d15c7.js"><link rel="prefetch" href="/assets/js/379.b81ba7dd.js"><link rel="prefetch" href="/assets/js/38.89138658.js"><link rel="prefetch" href="/assets/js/380.524c9b31.js"><link rel="prefetch" href="/assets/js/381.7ebfd6db.js"><link rel="prefetch" href="/assets/js/382.29edda0f.js"><link rel="prefetch" href="/assets/js/383.9642a212.js"><link rel="prefetch" href="/assets/js/384.086e3b42.js"><link rel="prefetch" href="/assets/js/385.a9bb46a8.js"><link rel="prefetch" href="/assets/js/386.f2561a39.js"><link rel="prefetch" href="/assets/js/387.ba9b6aaa.js"><link rel="prefetch" href="/assets/js/388.e0ace495.js"><link rel="prefetch" href="/assets/js/389.ba8c09dd.js"><link rel="prefetch" href="/assets/js/39.04f331e3.js"><link rel="prefetch" href="/assets/js/390.de1bb48b.js"><link rel="prefetch" href="/assets/js/391.7cc6edeb.js"><link rel="prefetch" href="/assets/js/392.0493a6f7.js"><link rel="prefetch" href="/assets/js/393.ba2d3e62.js"><link rel="prefetch" href="/assets/js/394.b3aa9224.js"><link rel="prefetch" href="/assets/js/395.f4df3a60.js"><link rel="prefetch" href="/assets/js/396.09644790.js"><link rel="prefetch" href="/assets/js/397.76163964.js"><link rel="prefetch" href="/assets/js/398.377fd8fc.js"><link rel="prefetch" href="/assets/js/399.39059be5.js"><link rel="prefetch" href="/assets/js/40.a21abf05.js"><link rel="prefetch" href="/assets/js/400.559a547f.js"><link rel="prefetch" href="/assets/js/401.bc6d738c.js"><link rel="prefetch" href="/assets/js/402.c504ed7b.js"><link rel="prefetch" href="/assets/js/403.77a0af9c.js"><link rel="prefetch" href="/assets/js/404.0f408cc6.js"><link rel="prefetch" href="/assets/js/405.90b0bab6.js"><link rel="prefetch" href="/assets/js/406.01b11432.js"><link rel="prefetch" href="/assets/js/407.58991ce5.js"><link rel="prefetch" href="/assets/js/408.9806278e.js"><link rel="prefetch" href="/assets/js/409.8d9b4bb3.js"><link rel="prefetch" href="/assets/js/41.6bcfc592.js"><link rel="prefetch" href="/assets/js/410.02dee620.js"><link rel="prefetch" href="/assets/js/411.3d12d3a6.js"><link rel="prefetch" href="/assets/js/412.37a62624.js"><link rel="prefetch" href="/assets/js/413.bda7ca34.js"><link rel="prefetch" href="/assets/js/414.2abb6547.js"><link rel="prefetch" href="/assets/js/415.1d271923.js"><link rel="prefetch" href="/assets/js/416.d1b11dfe.js"><link rel="prefetch" href="/assets/js/417.fcbf07ff.js"><link rel="prefetch" href="/assets/js/418.524d40ba.js"><link rel="prefetch" href="/assets/js/419.f264e463.js"><link rel="prefetch" href="/assets/js/42.ec85a270.js"><link rel="prefetch" href="/assets/js/420.8b99e60d.js"><link rel="prefetch" href="/assets/js/421.c697d876.js"><link rel="prefetch" href="/assets/js/422.4af54ae0.js"><link rel="prefetch" href="/assets/js/423.b75f24ff.js"><link rel="prefetch" href="/assets/js/424.ea80054f.js"><link rel="prefetch" href="/assets/js/425.804b48b0.js"><link rel="prefetch" href="/assets/js/426.ffed8383.js"><link rel="prefetch" href="/assets/js/427.2040bd22.js"><link rel="prefetch" href="/assets/js/428.b878fb56.js"><link rel="prefetch" href="/assets/js/429.f81fd922.js"><link rel="prefetch" href="/assets/js/43.c174449d.js"><link rel="prefetch" href="/assets/js/430.16f328ab.js"><link rel="prefetch" href="/assets/js/431.56f11924.js"><link rel="prefetch" href="/assets/js/432.e4c77710.js"><link rel="prefetch" href="/assets/js/433.29acf14b.js"><link rel="prefetch" href="/assets/js/434.33ee22fc.js"><link rel="prefetch" href="/assets/js/435.516f7600.js"><link rel="prefetch" href="/assets/js/436.28ae526a.js"><link rel="prefetch" href="/assets/js/437.b9bac473.js"><link rel="prefetch" href="/assets/js/438.711bd934.js"><link rel="prefetch" href="/assets/js/439.fe5f28bd.js"><link rel="prefetch" href="/assets/js/44.8704338b.js"><link rel="prefetch" href="/assets/js/440.b2f48747.js"><link rel="prefetch" href="/assets/js/441.4862a724.js"><link rel="prefetch" href="/assets/js/442.751f8ae7.js"><link rel="prefetch" href="/assets/js/443.9998dbe9.js"><link rel="prefetch" href="/assets/js/444.23d3f688.js"><link rel="prefetch" href="/assets/js/445.72419f35.js"><link rel="prefetch" href="/assets/js/446.21e02b7b.js"><link rel="prefetch" href="/assets/js/447.6bd039e5.js"><link rel="prefetch" href="/assets/js/448.af29ff31.js"><link rel="prefetch" href="/assets/js/449.bbdca196.js"><link rel="prefetch" href="/assets/js/45.f8a2a3b3.js"><link rel="prefetch" href="/assets/js/450.32e470b8.js"><link rel="prefetch" href="/assets/js/451.f4c8ff6a.js"><link rel="prefetch" href="/assets/js/452.c0ec8943.js"><link rel="prefetch" href="/assets/js/453.5af475c6.js"><link rel="prefetch" href="/assets/js/454.567aa6c1.js"><link rel="prefetch" href="/assets/js/455.326072d1.js"><link rel="prefetch" href="/assets/js/456.64b88847.js"><link rel="prefetch" href="/assets/js/457.61c91559.js"><link rel="prefetch" href="/assets/js/458.4f4d43d6.js"><link rel="prefetch" href="/assets/js/459.a88891cb.js"><link rel="prefetch" href="/assets/js/46.90855a0f.js"><link rel="prefetch" href="/assets/js/460.fb9e15f6.js"><link rel="prefetch" href="/assets/js/461.998a4991.js"><link rel="prefetch" href="/assets/js/462.56ecfb03.js"><link rel="prefetch" href="/assets/js/463.582cd053.js"><link rel="prefetch" href="/assets/js/464.f12a0050.js"><link rel="prefetch" href="/assets/js/465.cc3b08a8.js"><link rel="prefetch" href="/assets/js/466.ea7e4ce2.js"><link rel="prefetch" href="/assets/js/467.58700d93.js"><link rel="prefetch" href="/assets/js/468.bb9998cd.js"><link rel="prefetch" href="/assets/js/469.232d261d.js"><link rel="prefetch" href="/assets/js/47.02516d33.js"><link rel="prefetch" href="/assets/js/470.90ab2be8.js"><link rel="prefetch" href="/assets/js/471.3652fec6.js"><link rel="prefetch" href="/assets/js/472.bc7517c9.js"><link rel="prefetch" href="/assets/js/473.27b7892f.js"><link rel="prefetch" href="/assets/js/474.0d488768.js"><link rel="prefetch" href="/assets/js/475.bc33cf17.js"><link rel="prefetch" href="/assets/js/476.76ce67eb.js"><link rel="prefetch" href="/assets/js/477.a20657f6.js"><link rel="prefetch" href="/assets/js/478.8905ef26.js"><link rel="prefetch" href="/assets/js/479.23ec3dc9.js"><link rel="prefetch" href="/assets/js/48.8d38983c.js"><link rel="prefetch" href="/assets/js/480.105bf58e.js"><link rel="prefetch" href="/assets/js/481.d62a3699.js"><link rel="prefetch" href="/assets/js/482.6cb10cdb.js"><link rel="prefetch" href="/assets/js/483.15b9ef53.js"><link rel="prefetch" href="/assets/js/484.794aff9c.js"><link rel="prefetch" href="/assets/js/485.3e6ef3cb.js"><link rel="prefetch" href="/assets/js/486.fc20eb22.js"><link rel="prefetch" href="/assets/js/487.2a4f7d47.js"><link rel="prefetch" href="/assets/js/488.24ba9af5.js"><link rel="prefetch" href="/assets/js/489.d451928e.js"><link rel="prefetch" href="/assets/js/49.bd70c59c.js"><link rel="prefetch" href="/assets/js/490.d83e4fc7.js"><link rel="prefetch" href="/assets/js/491.0210a738.js"><link rel="prefetch" href="/assets/js/492.3a69cd85.js"><link rel="prefetch" href="/assets/js/493.89d2920f.js"><link rel="prefetch" href="/assets/js/494.b7d1c15e.js"><link rel="prefetch" href="/assets/js/495.7ccfe17f.js"><link rel="prefetch" href="/assets/js/496.0d6c912a.js"><link rel="prefetch" href="/assets/js/497.087ca2c6.js"><link rel="prefetch" href="/assets/js/498.f2b3c894.js"><link rel="prefetch" href="/assets/js/499.e741f312.js"><link rel="prefetch" href="/assets/js/5.405f2620.js"><link rel="prefetch" href="/assets/js/500.cb9babb9.js"><link rel="prefetch" href="/assets/js/501.63a859b6.js"><link rel="prefetch" href="/assets/js/502.f346b273.js"><link rel="prefetch" href="/assets/js/503.cdcd3de3.js"><link rel="prefetch" href="/assets/js/504.e83ec450.js"><link rel="prefetch" href="/assets/js/505.95f18293.js"><link rel="prefetch" href="/assets/js/506.02060a3c.js"><link rel="prefetch" href="/assets/js/507.859d6ae4.js"><link rel="prefetch" href="/assets/js/508.9724d886.js"><link rel="prefetch" href="/assets/js/509.e17dd53e.js"><link rel="prefetch" href="/assets/js/51.3dfc6350.js"><link rel="prefetch" href="/assets/js/510.ea0c942f.js"><link rel="prefetch" href="/assets/js/511.64a7f9a8.js"><link rel="prefetch" href="/assets/js/512.6cce418a.js"><link rel="prefetch" href="/assets/js/513.ea813fe8.js"><link rel="prefetch" href="/assets/js/514.10242470.js"><link rel="prefetch" href="/assets/js/515.5308bdf6.js"><link rel="prefetch" href="/assets/js/516.dfb113bc.js"><link rel="prefetch" href="/assets/js/517.96c71069.js"><link rel="prefetch" href="/assets/js/518.5594480e.js"><link rel="prefetch" href="/assets/js/519.91e848ae.js"><link rel="prefetch" href="/assets/js/52.dd230cd7.js"><link rel="prefetch" href="/assets/js/520.ebe69ce9.js"><link rel="prefetch" href="/assets/js/521.92b80342.js"><link rel="prefetch" href="/assets/js/522.6ce581ea.js"><link rel="prefetch" href="/assets/js/523.40b7f2f9.js"><link rel="prefetch" href="/assets/js/524.4ef256d3.js"><link rel="prefetch" href="/assets/js/525.19741e4a.js"><link rel="prefetch" href="/assets/js/526.e5de1675.js"><link rel="prefetch" href="/assets/js/527.9a79cd42.js"><link rel="prefetch" href="/assets/js/528.72732eb8.js"><link rel="prefetch" href="/assets/js/529.2ea03e45.js"><link rel="prefetch" href="/assets/js/53.a349c565.js"><link rel="prefetch" href="/assets/js/530.5d1103e7.js"><link rel="prefetch" href="/assets/js/531.82b032d6.js"><link rel="prefetch" href="/assets/js/532.12ee4beb.js"><link rel="prefetch" href="/assets/js/533.db9a90f7.js"><link rel="prefetch" href="/assets/js/534.fe139db4.js"><link rel="prefetch" href="/assets/js/535.056a6fbb.js"><link rel="prefetch" href="/assets/js/536.6bf85c15.js"><link rel="prefetch" href="/assets/js/537.6e2e1ccf.js"><link rel="prefetch" href="/assets/js/538.54eddb3b.js"><link rel="prefetch" href="/assets/js/539.6f00a207.js"><link rel="prefetch" href="/assets/js/54.e292b52f.js"><link rel="prefetch" href="/assets/js/540.9c956205.js"><link rel="prefetch" href="/assets/js/541.50f41228.js"><link rel="prefetch" href="/assets/js/542.a2b1879e.js"><link rel="prefetch" href="/assets/js/543.4e5e17c9.js"><link rel="prefetch" href="/assets/js/544.63d85227.js"><link rel="prefetch" href="/assets/js/545.c3923644.js"><link rel="prefetch" href="/assets/js/546.e64ad073.js"><link rel="prefetch" href="/assets/js/547.35a8752d.js"><link rel="prefetch" href="/assets/js/548.b62a1348.js"><link rel="prefetch" href="/assets/js/549.369e2ea0.js"><link rel="prefetch" href="/assets/js/55.21bb2983.js"><link rel="prefetch" href="/assets/js/550.b4632248.js"><link rel="prefetch" href="/assets/js/551.18f1879c.js"><link rel="prefetch" href="/assets/js/552.162e63cd.js"><link rel="prefetch" href="/assets/js/553.6998130e.js"><link rel="prefetch" href="/assets/js/554.89126c3d.js"><link rel="prefetch" href="/assets/js/555.a5f63b8a.js"><link rel="prefetch" href="/assets/js/556.35381cef.js"><link rel="prefetch" href="/assets/js/557.ceeecf52.js"><link rel="prefetch" href="/assets/js/558.253e6e4f.js"><link rel="prefetch" href="/assets/js/559.5cfbb773.js"><link rel="prefetch" href="/assets/js/56.5382d6b4.js"><link rel="prefetch" href="/assets/js/560.cca52f22.js"><link rel="prefetch" href="/assets/js/561.ea8d1141.js"><link rel="prefetch" href="/assets/js/562.c32e7b96.js"><link rel="prefetch" href="/assets/js/563.9bdd42e7.js"><link rel="prefetch" href="/assets/js/564.b3b87ec0.js"><link rel="prefetch" href="/assets/js/565.4be0d0f7.js"><link rel="prefetch" href="/assets/js/566.9f379d12.js"><link rel="prefetch" href="/assets/js/567.261e3181.js"><link rel="prefetch" href="/assets/js/568.4229e365.js"><link rel="prefetch" href="/assets/js/569.e662c167.js"><link rel="prefetch" href="/assets/js/57.8129f7e0.js"><link rel="prefetch" href="/assets/js/570.97ff6423.js"><link rel="prefetch" href="/assets/js/571.de1377cd.js"><link rel="prefetch" href="/assets/js/572.48b8400b.js"><link rel="prefetch" href="/assets/js/573.8251ebaf.js"><link rel="prefetch" href="/assets/js/574.ec3d6c1e.js"><link rel="prefetch" href="/assets/js/575.b0d429a1.js"><link rel="prefetch" href="/assets/js/576.98ce9170.js"><link rel="prefetch" href="/assets/js/577.85fc2017.js"><link rel="prefetch" href="/assets/js/578.1393ac7f.js"><link rel="prefetch" href="/assets/js/579.1340e178.js"><link rel="prefetch" href="/assets/js/58.85ac2740.js"><link rel="prefetch" href="/assets/js/580.a5979445.js"><link rel="prefetch" href="/assets/js/581.effdc269.js"><link rel="prefetch" href="/assets/js/582.13276063.js"><link rel="prefetch" href="/assets/js/583.357a2443.js"><link rel="prefetch" href="/assets/js/584.338ef731.js"><link rel="prefetch" href="/assets/js/585.87932741.js"><link rel="prefetch" href="/assets/js/586.b1d6e000.js"><link rel="prefetch" href="/assets/js/587.ed5b8377.js"><link rel="prefetch" href="/assets/js/588.16d2c418.js"><link rel="prefetch" href="/assets/js/589.c96fd7fa.js"><link rel="prefetch" href="/assets/js/59.0b225757.js"><link rel="prefetch" href="/assets/js/590.1a06b2a0.js"><link rel="prefetch" href="/assets/js/591.0efd886c.js"><link rel="prefetch" href="/assets/js/592.b22d0ef5.js"><link rel="prefetch" href="/assets/js/593.84ed6ebe.js"><link rel="prefetch" href="/assets/js/594.cd721b88.js"><link rel="prefetch" href="/assets/js/595.2400817a.js"><link rel="prefetch" href="/assets/js/596.f2c512d1.js"><link rel="prefetch" href="/assets/js/597.df10ec57.js"><link rel="prefetch" href="/assets/js/598.61ef6a7d.js"><link rel="prefetch" href="/assets/js/599.0bebb562.js"><link rel="prefetch" href="/assets/js/6.29d112b1.js"><link rel="prefetch" href="/assets/js/60.3bbab51d.js"><link rel="prefetch" href="/assets/js/600.1ea7596f.js"><link rel="prefetch" href="/assets/js/601.f2642bb3.js"><link rel="prefetch" href="/assets/js/602.400cc987.js"><link rel="prefetch" href="/assets/js/603.db77d173.js"><link rel="prefetch" href="/assets/js/604.0ffa30ae.js"><link rel="prefetch" href="/assets/js/605.32ca9607.js"><link rel="prefetch" href="/assets/js/606.8c1e5683.js"><link rel="prefetch" href="/assets/js/607.9c9463ef.js"><link rel="prefetch" href="/assets/js/608.d5efa77e.js"><link rel="prefetch" href="/assets/js/609.5bbffb7d.js"><link rel="prefetch" href="/assets/js/61.f7301486.js"><link rel="prefetch" href="/assets/js/610.5b0fc9da.js"><link rel="prefetch" href="/assets/js/611.bb8058c9.js"><link rel="prefetch" href="/assets/js/612.b0788f43.js"><link rel="prefetch" href="/assets/js/613.49511e65.js"><link rel="prefetch" href="/assets/js/614.fae3eacf.js"><link rel="prefetch" href="/assets/js/615.359e5899.js"><link rel="prefetch" href="/assets/js/616.905132f4.js"><link rel="prefetch" href="/assets/js/617.6c8c594e.js"><link rel="prefetch" href="/assets/js/618.6ac4f3ff.js"><link rel="prefetch" href="/assets/js/619.411a0c14.js"><link rel="prefetch" href="/assets/js/62.9aeede84.js"><link rel="prefetch" href="/assets/js/620.56155724.js"><link rel="prefetch" href="/assets/js/621.149d7933.js"><link rel="prefetch" href="/assets/js/622.f0c9bc08.js"><link rel="prefetch" href="/assets/js/623.e0989fbe.js"><link rel="prefetch" href="/assets/js/624.80b1f6a9.js"><link rel="prefetch" href="/assets/js/625.a0a392c4.js"><link rel="prefetch" href="/assets/js/626.56fd4e8a.js"><link rel="prefetch" href="/assets/js/627.264e7313.js"><link rel="prefetch" href="/assets/js/628.7a868b19.js"><link rel="prefetch" href="/assets/js/629.e7e15da1.js"><link rel="prefetch" href="/assets/js/63.4df55c8b.js"><link rel="prefetch" href="/assets/js/630.998c9b61.js"><link rel="prefetch" href="/assets/js/631.69aa049c.js"><link rel="prefetch" href="/assets/js/632.da3882c1.js"><link rel="prefetch" href="/assets/js/633.0d49adf0.js"><link rel="prefetch" href="/assets/js/634.f9984ede.js"><link rel="prefetch" href="/assets/js/635.f0439f65.js"><link rel="prefetch" href="/assets/js/636.54de4194.js"><link rel="prefetch" href="/assets/js/637.55d1c226.js"><link rel="prefetch" href="/assets/js/638.2a9a510f.js"><link rel="prefetch" href="/assets/js/639.8bec360e.js"><link rel="prefetch" href="/assets/js/64.7f3e5e81.js"><link rel="prefetch" href="/assets/js/640.30d7f96e.js"><link rel="prefetch" href="/assets/js/641.68100098.js"><link rel="prefetch" href="/assets/js/642.4b793817.js"><link rel="prefetch" href="/assets/js/643.d86a81ea.js"><link rel="prefetch" href="/assets/js/644.76327ea2.js"><link rel="prefetch" href="/assets/js/645.0ac6a923.js"><link rel="prefetch" href="/assets/js/646.cd92f728.js"><link rel="prefetch" href="/assets/js/647.f2c624e1.js"><link rel="prefetch" href="/assets/js/648.c8f3b955.js"><link rel="prefetch" href="/assets/js/649.6370753b.js"><link rel="prefetch" href="/assets/js/65.2beeae9b.js"><link rel="prefetch" href="/assets/js/650.afe31909.js"><link rel="prefetch" href="/assets/js/651.87971ec0.js"><link rel="prefetch" href="/assets/js/652.0adf10a6.js"><link rel="prefetch" href="/assets/js/653.1f655726.js"><link rel="prefetch" href="/assets/js/654.53e24c7c.js"><link rel="prefetch" href="/assets/js/655.c95a66ea.js"><link rel="prefetch" href="/assets/js/656.38b5a5ea.js"><link rel="prefetch" href="/assets/js/657.3167aa94.js"><link rel="prefetch" href="/assets/js/658.7c40ff62.js"><link rel="prefetch" href="/assets/js/659.5d2b9b54.js"><link rel="prefetch" href="/assets/js/66.44b214db.js"><link rel="prefetch" href="/assets/js/660.96a8da9e.js"><link rel="prefetch" href="/assets/js/661.4de3b6c1.js"><link rel="prefetch" href="/assets/js/662.7d9bf181.js"><link rel="prefetch" href="/assets/js/663.4ccaf40a.js"><link rel="prefetch" href="/assets/js/664.7ab4fa53.js"><link rel="prefetch" href="/assets/js/665.32245d26.js"><link rel="prefetch" href="/assets/js/666.e6617151.js"><link rel="prefetch" href="/assets/js/667.fb3b0547.js"><link rel="prefetch" href="/assets/js/668.3d1b2e36.js"><link rel="prefetch" href="/assets/js/669.b769905f.js"><link rel="prefetch" href="/assets/js/67.c31aaacf.js"><link rel="prefetch" href="/assets/js/670.88ed3af3.js"><link rel="prefetch" href="/assets/js/671.1aff6bfe.js"><link rel="prefetch" href="/assets/js/672.c90888f7.js"><link rel="prefetch" href="/assets/js/673.81241fdc.js"><link rel="prefetch" href="/assets/js/674.838a424d.js"><link rel="prefetch" href="/assets/js/675.603ac896.js"><link rel="prefetch" href="/assets/js/676.ff44b5dc.js"><link rel="prefetch" href="/assets/js/677.41a8087a.js"><link rel="prefetch" href="/assets/js/678.f0eb8d04.js"><link rel="prefetch" href="/assets/js/679.db78199e.js"><link rel="prefetch" href="/assets/js/68.08607c89.js"><link rel="prefetch" href="/assets/js/680.8fded9d4.js"><link rel="prefetch" href="/assets/js/681.0b019dfd.js"><link rel="prefetch" href="/assets/js/682.746e9190.js"><link rel="prefetch" href="/assets/js/683.d5c00845.js"><link rel="prefetch" href="/assets/js/684.b3207cad.js"><link rel="prefetch" href="/assets/js/685.d78f18ba.js"><link rel="prefetch" href="/assets/js/686.5aaecd19.js"><link rel="prefetch" href="/assets/js/687.821a06f4.js"><link rel="prefetch" href="/assets/js/688.8bbc1890.js"><link rel="prefetch" href="/assets/js/689.79b49e8c.js"><link rel="prefetch" href="/assets/js/69.509245d6.js"><link rel="prefetch" href="/assets/js/690.fa62f9dd.js"><link rel="prefetch" href="/assets/js/691.d3eb1a60.js"><link rel="prefetch" href="/assets/js/692.738f14bb.js"><link rel="prefetch" href="/assets/js/693.e6a497a2.js"><link rel="prefetch" href="/assets/js/694.6eea1c54.js"><link rel="prefetch" href="/assets/js/695.88e6acee.js"><link rel="prefetch" href="/assets/js/696.de10297f.js"><link rel="prefetch" href="/assets/js/697.96d04062.js"><link rel="prefetch" href="/assets/js/698.200cc84f.js"><link rel="prefetch" href="/assets/js/699.f11fc627.js"><link rel="prefetch" href="/assets/js/7.c16198b8.js"><link rel="prefetch" href="/assets/js/70.5f6285b1.js"><link rel="prefetch" href="/assets/js/700.93d48f59.js"><link rel="prefetch" href="/assets/js/701.b861f29a.js"><link rel="prefetch" href="/assets/js/702.dc82e05c.js"><link rel="prefetch" href="/assets/js/703.625ce87c.js"><link rel="prefetch" href="/assets/js/704.005a0a7c.js"><link rel="prefetch" href="/assets/js/705.16ad9230.js"><link rel="prefetch" href="/assets/js/706.4eead30a.js"><link rel="prefetch" href="/assets/js/707.730306ce.js"><link rel="prefetch" href="/assets/js/708.e37e743a.js"><link rel="prefetch" href="/assets/js/709.f2144f52.js"><link rel="prefetch" href="/assets/js/71.d5d0dae5.js"><link rel="prefetch" href="/assets/js/710.ee9d9b17.js"><link rel="prefetch" href="/assets/js/711.2813c338.js"><link rel="prefetch" href="/assets/js/712.e801bce4.js"><link rel="prefetch" href="/assets/js/713.21fc267c.js"><link rel="prefetch" href="/assets/js/714.4ec35525.js"><link rel="prefetch" href="/assets/js/715.fdc3cc84.js"><link rel="prefetch" href="/assets/js/716.324932ad.js"><link rel="prefetch" href="/assets/js/717.a072a66f.js"><link rel="prefetch" href="/assets/js/718.575e0305.js"><link rel="prefetch" href="/assets/js/719.5fdd55de.js"><link rel="prefetch" href="/assets/js/72.25648231.js"><link rel="prefetch" href="/assets/js/720.61477f23.js"><link rel="prefetch" href="/assets/js/721.c8bdab00.js"><link rel="prefetch" href="/assets/js/722.9255f385.js"><link rel="prefetch" href="/assets/js/723.f27792a4.js"><link rel="prefetch" href="/assets/js/724.cd504f88.js"><link rel="prefetch" href="/assets/js/725.55c845fa.js"><link rel="prefetch" href="/assets/js/726.bb49a9db.js"><link rel="prefetch" href="/assets/js/727.53d587fe.js"><link rel="prefetch" href="/assets/js/728.86972387.js"><link rel="prefetch" href="/assets/js/729.02fa0263.js"><link rel="prefetch" href="/assets/js/73.29902c1f.js"><link rel="prefetch" href="/assets/js/730.817156d1.js"><link rel="prefetch" href="/assets/js/731.6f5d6735.js"><link rel="prefetch" href="/assets/js/732.9a5ff781.js"><link rel="prefetch" href="/assets/js/733.bcb13916.js"><link rel="prefetch" href="/assets/js/734.11482b19.js"><link rel="prefetch" href="/assets/js/735.8c0d62f3.js"><link rel="prefetch" href="/assets/js/736.06465705.js"><link rel="prefetch" href="/assets/js/737.79741d87.js"><link rel="prefetch" href="/assets/js/738.cad12ff9.js"><link rel="prefetch" href="/assets/js/739.cb09e552.js"><link rel="prefetch" href="/assets/js/74.bcf666a0.js"><link rel="prefetch" href="/assets/js/740.029b1950.js"><link rel="prefetch" href="/assets/js/741.b937216a.js"><link rel="prefetch" href="/assets/js/742.ec02c706.js"><link rel="prefetch" href="/assets/js/743.70a96283.js"><link rel="prefetch" href="/assets/js/744.909b870c.js"><link rel="prefetch" href="/assets/js/745.80defb2d.js"><link rel="prefetch" href="/assets/js/746.fb972248.js"><link rel="prefetch" href="/assets/js/747.1a7b52fd.js"><link rel="prefetch" href="/assets/js/748.036f5d16.js"><link rel="prefetch" href="/assets/js/749.bd9a413d.js"><link rel="prefetch" href="/assets/js/75.23c5a54d.js"><link rel="prefetch" href="/assets/js/750.3f1ae8f5.js"><link rel="prefetch" href="/assets/js/751.8897bc9f.js"><link rel="prefetch" href="/assets/js/752.9b387659.js"><link rel="prefetch" href="/assets/js/753.f411ce21.js"><link rel="prefetch" href="/assets/js/754.26def684.js"><link rel="prefetch" href="/assets/js/755.923aff62.js"><link rel="prefetch" href="/assets/js/756.9965743a.js"><link rel="prefetch" href="/assets/js/757.0c6bbbfd.js"><link rel="prefetch" href="/assets/js/758.a830f8b1.js"><link rel="prefetch" href="/assets/js/759.987cad77.js"><link rel="prefetch" href="/assets/js/76.f54f3d4f.js"><link rel="prefetch" href="/assets/js/760.9f2652a0.js"><link rel="prefetch" href="/assets/js/761.df01a0ee.js"><link rel="prefetch" href="/assets/js/762.e0c05a1a.js"><link rel="prefetch" href="/assets/js/763.da8a60bd.js"><link rel="prefetch" href="/assets/js/764.9f2a2830.js"><link rel="prefetch" href="/assets/js/765.44e61161.js"><link rel="prefetch" href="/assets/js/766.cd7da8c1.js"><link rel="prefetch" href="/assets/js/767.6ea1fea2.js"><link rel="prefetch" href="/assets/js/768.91529b8f.js"><link rel="prefetch" href="/assets/js/769.194d7a3e.js"><link rel="prefetch" href="/assets/js/77.3d43a163.js"><link rel="prefetch" href="/assets/js/770.227fd5b9.js"><link rel="prefetch" href="/assets/js/771.44d5e37e.js"><link rel="prefetch" href="/assets/js/772.234d9bf6.js"><link rel="prefetch" href="/assets/js/773.ff1dfb6a.js"><link rel="prefetch" href="/assets/js/774.d401364f.js"><link rel="prefetch" href="/assets/js/775.37a7cf41.js"><link rel="prefetch" href="/assets/js/776.0cd10853.js"><link rel="prefetch" href="/assets/js/777.599a3a48.js"><link rel="prefetch" href="/assets/js/778.eef27a95.js"><link rel="prefetch" href="/assets/js/779.29351199.js"><link rel="prefetch" href="/assets/js/78.fd0780ac.js"><link rel="prefetch" href="/assets/js/780.74caed94.js"><link rel="prefetch" href="/assets/js/781.ee0fa9b5.js"><link rel="prefetch" href="/assets/js/782.7cffed09.js"><link rel="prefetch" href="/assets/js/783.7f01f518.js"><link rel="prefetch" href="/assets/js/784.5f65e3d7.js"><link rel="prefetch" href="/assets/js/785.d7e13880.js"><link rel="prefetch" href="/assets/js/786.6110d12f.js"><link rel="prefetch" href="/assets/js/787.334a5cdd.js"><link rel="prefetch" href="/assets/js/788.f261bc71.js"><link rel="prefetch" href="/assets/js/789.b6d74f7d.js"><link rel="prefetch" href="/assets/js/79.7b5d6224.js"><link rel="prefetch" href="/assets/js/790.fa948ec4.js"><link rel="prefetch" href="/assets/js/791.22080013.js"><link rel="prefetch" href="/assets/js/792.31ce806c.js"><link rel="prefetch" href="/assets/js/793.9fd0c56f.js"><link rel="prefetch" href="/assets/js/794.44a8cd9c.js"><link rel="prefetch" href="/assets/js/795.9f8346e5.js"><link rel="prefetch" href="/assets/js/796.0de9c7a1.js"><link rel="prefetch" href="/assets/js/797.83ac32a6.js"><link rel="prefetch" href="/assets/js/798.393fc81d.js"><link rel="prefetch" href="/assets/js/799.c1fb3981.js"><link rel="prefetch" href="/assets/js/8.3275ed06.js"><link rel="prefetch" href="/assets/js/80.df3f0a1f.js"><link rel="prefetch" href="/assets/js/800.2832adeb.js"><link rel="prefetch" href="/assets/js/801.04c58fc4.js"><link rel="prefetch" href="/assets/js/81.3d90ef6b.js"><link rel="prefetch" href="/assets/js/82.2d42448d.js"><link rel="prefetch" href="/assets/js/83.900b4de2.js"><link rel="prefetch" href="/assets/js/84.ff570f67.js"><link rel="prefetch" href="/assets/js/85.e3b3af39.js"><link rel="prefetch" href="/assets/js/86.17b5aedc.js"><link rel="prefetch" href="/assets/js/87.f931d1d6.js"><link rel="prefetch" href="/assets/js/88.d55863cd.js"><link rel="prefetch" href="/assets/js/89.15a9a6d7.js"><link rel="prefetch" href="/assets/js/9.04948a9d.js"><link rel="prefetch" href="/assets/js/90.22696aa9.js"><link rel="prefetch" href="/assets/js/91.f1bd8a2e.js"><link rel="prefetch" href="/assets/js/92.85733094.js"><link rel="prefetch" href="/assets/js/93.59bacfd7.js"><link rel="prefetch" href="/assets/js/94.a5f9b7a0.js"><link rel="prefetch" href="/assets/js/95.be52d65a.js"><link rel="prefetch" href="/assets/js/96.0b76ba8e.js"><link rel="prefetch" href="/assets/js/97.28183cd4.js"><link rel="prefetch" href="/assets/js/98.2d22829c.js"><link rel="prefetch" href="/assets/js/99.ed602a20.js">
    <link rel="stylesheet" href="/assets/css/0.styles.a3df589e.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">AJ</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <div></div> <div style="padding-left:1.5rem;"><div></div></div> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>区块链基础</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/blockchain/encryption-expand.html" class="sidebar-link">常见的密码技术</a></li><li><a href="/go-block/blockchain/encryption.html" class="sidebar-link">密码学安全</a></li><li><a href="/go-block/blockchain/ethereum.html" class="sidebar-link">以太坊智能合约</a></li><li><a href="/go-block/blockchain/hyperledgerfabric.html" class="sidebar-link">hyperledger fabric</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Hyperledger Fabric 1.2</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric/1搭建网络-纯手动.html" class="active sidebar-link">1搭建网络-纯手动</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/go-block/fabric/1搭建网络-纯手动.html#_1-生成fabric证书" class="sidebar-link">1. 生成Fabric证书</a></li><li class="sidebar-sub-header"><a href="/go-block/fabric/1搭建网络-纯手动.html#_2-创始块文件和通道文件的生成" class="sidebar-link">2. 创始块文件和通道文件的生成</a></li><li class="sidebar-sub-header"><a href="/go-block/fabric/1搭建网络-纯手动.html#_3-docker-compose启动容器" class="sidebar-link">3. docker-compose启动容器</a></li><li class="sidebar-sub-header"><a href="/go-block/fabric/1搭建网络-纯手动.html#_4-peer操作" class="sidebar-link">4. Peer操作</a></li><li class="sidebar-sub-header"><a href="/go-block/fabric/1搭建网络-纯手动.html#_5-通过客户端切换操作的节点" class="sidebar-link">5. 通过客户端切换操作的节点</a></li></ul></li><li><a href="/go-block/fabric/1环境搭建.html" class="sidebar-link">1环境搭建</a></li><li><a href="/go-block/fabric/2Fabric介绍.html" class="sidebar-link">2Fabric介绍</a></li><li><a href="/go-block/fabric/3Fabric核心模块.html" class="sidebar-link">3Fabric核心模块</a></li><li><a href="/go-block/fabric/4网络搭建-脚本.html" class="sidebar-link">4网络搭建-脚本</a></li><li><a href="/go-block/fabric/5智能合约.html" class="sidebar-link">5智能合约</a></li><li><a href="/go-block/fabric/6Fabric账号.html" class="sidebar-link">6Fabric账号</a></li><li><a href="/go-block/fabric/7Solo多机多节点部署.html" class="sidebar-link">7Solo多机多节点部署</a></li><li><a href="/go-block/fabric/8Kafka多机多节点部署.html" class="sidebar-link">8Kafka多机多节点部署</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 2.X</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric2.x/" class="sidebar-link">2.X目录</a></li></ul></section></li></ul> </aside> <!----> <!----> <main class="page"><div class="theme-default-content" style="margin-bottom:-5rem;"><div class="bar"><div class="bar-intro"><div class="text">
      流逝的是岁月，不变的是情怀.
        </div> <div class="text">
      坚持学习，是为了成就更好的自己. <br></div> <div>公众号[中关村程序员]</div></div></div> <!----></div> <div class="theme-default-content content__default"><h2 id="_1-生成fabric证书"><a href="#_1-生成fabric证书" class="header-anchor">#</a> 1. 生成Fabric证书</h2> <blockquote><p>我们可以自己组建一个Fabric网路, 网络结构如下:</p> <p>网络中唯一的通道:   itcastchannel</p> <ul><li>排序节点 1 个 -&gt; 测试
<ul><li>排序节点组织名: OrgOrderer</li> <li>.....组织ID:  OrgOrdererMSP</li> <li>排序节点组织访问的根域名:
<ul><li>itcast.com</li></ul></li> <li>排序节点组织中唯一的节点访问二级域名:
<ul><li>orderer.itcast.com</li></ul></li></ul></li> <li>组织个数 2 个, 分别为go和cpp, 每个组织分别有两个peer节点, 用户个数为3
<ul><li>go组织
<ul><li>组织名: OrgGo</li> <li>组织ID: OrgGoMSP</li> <li>访问组织的域名: orggo.itcast.com</li> <li>锚节点: peer0这个节点</li></ul></li> <li>cpp组织
<ul><li>组织名: OrgCpp</li> <li>组织ID: OrgCppMSP</li> <li>访问组织的域名: orgcpp.itcast.com</li> <li>锚节点: peer1这个节点</li></ul></li></ul></li></ul></blockquote> <table><thead><tr><th style="text-align:center;">机构名称</th> <th style="text-align:center;">组织标识符</th> <th style="text-align:center;">组织ID</th></tr></thead> <tbody><tr><td style="text-align:center;">Go学科</td> <td style="text-align:center;">OrgGo</td> <td style="text-align:center;">OrgGoMSP</td></tr> <tr><td style="text-align:center;">CPP</td> <td style="text-align:center;">OrgCpp</td> <td style="text-align:center;">OrgCppMSP</td></tr></tbody></table> <h3 id="_1-1-命令介绍"><a href="#_1-1-命令介绍" class="header-anchor">#</a> 1.1 命令介绍</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>$ cryptogen --help
$ cryptogen generate --config<span class="token operator">=</span>配置文件
</code></pre></div><h3 id="_1-2-配置文件的编写"><a href="#_1-2-配置文件的编写" class="header-anchor">#</a> 1.2 配置文件的编写</h3> <div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token comment"># crypto-config.yaml</span>
<span class="token comment"># ---------------------------------------------------------------------------</span>
<span class="token comment"># &quot;OrdererOrgs&quot; - Definition of organizations managing orderer nodes</span>
<span class="token comment"># ---------------------------------------------------------------------------</span>
<span class="token key atrule">OrdererOrgs</span><span class="token punctuation">:</span>
  <span class="token comment"># ---------------------------------------------------------------------------</span>
  <span class="token comment"># Orderer</span>
  <span class="token comment"># ---------------------------------------------------------------------------</span>
  <span class="token punctuation">-</span> <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgOrderer
    <span class="token key atrule">Domain</span><span class="token punctuation">:</span> itcast.com

    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># &quot;Specs&quot; - See PeerOrgs below for complete description</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token key atrule">Specs</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token key atrule">Hostname</span><span class="token punctuation">:</span> orderer

<span class="token comment"># ---------------------------------------------------------------------------</span>
<span class="token comment"># &quot;PeerOrgs&quot; - Definition of organizations managing peer nodes</span>
<span class="token comment"># ---------------------------------------------------------------------------</span>
<span class="token key atrule">PeerOrgs</span><span class="token punctuation">:</span>
  <span class="token comment"># ---------------------------------------------------------------------------</span>
  <span class="token comment"># Org1</span>
  <span class="token comment"># ---------------------------------------------------------------------------</span>
  <span class="token punctuation">-</span> <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgGo
    <span class="token key atrule">Domain</span><span class="token punctuation">:</span> orggo.itcast.com
    <span class="token key atrule">EnableNodeOUs</span><span class="token punctuation">:</span> <span class="token boolean important">false</span>

    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># &quot;CA&quot;</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># Uncomment this section to enable the explicit definition of the CA for this</span>
    <span class="token comment"># organization.  This entry is a Spec.  See &quot;Specs&quot; section below for details.</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># CA:</span>
    <span class="token comment">#    Hostname: ca # implicitly ca.org1.example.com</span>
    <span class="token comment">#    Country: US</span>
    <span class="token comment">#    Province: California</span>
    <span class="token comment">#    Locality: San Francisco</span>
    <span class="token comment">#    OrganizationalUnit: Hyperledger Fabric</span>
    <span class="token comment">#    StreetAddress: address for org # default nil</span>
    <span class="token comment">#    PostalCode: postalCode for org # default nil</span>

    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># &quot;Specs&quot;</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># Uncomment this section to enable the explicit definition of hosts in your</span>
    <span class="token comment"># configuration.  Most users will want to use Template, below</span>
    <span class="token comment">#</span>
    <span class="token comment"># Specs is an array of Spec entries.  Each Spec entry consists of two fields:</span>
    <span class="token comment">#   - Hostname:   (Required) The desired hostname, sans the domain.</span>
    <span class="token comment">#   - CommonName: (Optional) Specifies the template or explicit override for</span>
    <span class="token comment">#                 the CN.  By default, this is the template:</span>
    <span class="token comment">#</span>
    <span class="token comment">#                              &quot;{{.Hostname}}.{{.Domain}}&quot;</span>
    <span class="token comment">#</span>
    <span class="token comment">#                 which obtains its values from the Spec.Hostname and</span>
    <span class="token comment">#                 Org.Domain, respectively.</span>
    <span class="token comment">#   - SANS:       (Optional) Specifies one or more Subject Alternative Names</span>
    <span class="token comment">#                 to be set in the resulting x509. Accepts template</span>
    <span class="token comment">#                 variables {{.Hostname}}, {{.Domain}}, {{.CommonName}}. IP</span>
    <span class="token comment">#                 addresses provided here will be properly recognized. Other</span>
    <span class="token comment">#                 values will be taken as DNS names.</span>
    <span class="token comment">#                 NOTE: Two implicit entries are created for you:</span>
    <span class="token comment">#                     - {{ .CommonName }}</span>
    <span class="token comment">#                     - {{ .Hostname }}</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># Specs:</span>
    <span class="token comment">#   - Hostname: foo # implicitly &quot;foo.org1.example.com&quot;</span>
    <span class="token comment">#     CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above</span>
    <span class="token comment">#     SANS:</span>
    <span class="token comment">#       - &quot;bar.{{.Domain}}&quot;</span>
    <span class="token comment">#       - &quot;altfoo.{{.Domain}}&quot;</span>
    <span class="token comment">#       - &quot;{{.Hostname}}.org6.net&quot;</span>
    <span class="token comment">#       - 172.16.10.31</span>
    <span class="token comment">#   - Hostname: bar</span>
    <span class="token comment">#   - Hostname: baz</span>

    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># &quot;Template&quot;</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># Allows for the definition of 1 or more hosts that are created sequentially</span>
    <span class="token comment"># from a template. By default, this looks like &quot;peer%d&quot; from 0 to Count-1.</span>
    <span class="token comment"># You may override the number of nodes (Count), the starting index (Start)</span>
    <span class="token comment"># or the template used to construct the name (Hostname).</span>
    <span class="token comment">#</span>
    <span class="token comment"># Note: Template and Specs are not mutually exclusive.  You may define both</span>
    <span class="token comment"># sections and the aggregate nodes will be created for you.  Take care with</span>
    <span class="token comment"># name collisions</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token key atrule">Template</span><span class="token punctuation">:</span>
      <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">2</span>
      <span class="token comment"># Start: 5</span>
      <span class="token comment"># Hostname: {{.Prefix}}{{.Index}} # default</span>
      <span class="token comment"># SANS:</span>
      <span class="token comment">#   - &quot;{{.Hostname}}.alt.{{.Domain}}&quot;</span>

    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># &quot;Users&quot;</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token comment"># Count: The number of user accounts _in addition_ to Admin</span>
    <span class="token comment"># ---------------------------------------------------------------------------</span>
    <span class="token key atrule">Users</span><span class="token punctuation">:</span>
      <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">3</span>

  <span class="token comment"># ---------------------------------------------------------------------------</span>
  <span class="token comment"># Org2: See &quot;Org1&quot; for full specification</span>
  <span class="token comment"># ---------------------------------------------------------------------------</span>
  <span class="token punctuation">-</span> <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgCpp
    <span class="token key atrule">Domain</span><span class="token punctuation">:</span> orgcpp.itcast.com
    <span class="token key atrule">EnableNodeOUs</span><span class="token punctuation">:</span> <span class="token boolean important">false</span>
    <span class="token key atrule">Template</span><span class="token punctuation">:</span>
      <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">2</span>
    <span class="token key atrule">Users</span><span class="token punctuation">:</span>
      <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">3</span>
</code></pre></div><h3 id="_1-3-证书文件的生成"><a href="#_1-3-证书文件的生成" class="header-anchor">#</a> 1.3 证书文件的生成</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>
</code></pre></div><h2 id="_2-创始块文件和通道文件的生成"><a href="#_2-创始块文件和通道文件的生成" class="header-anchor">#</a> 2. 创始块文件和通道文件的生成</h2> <h3 id="_2-1-命令介绍"><a href="#_2-1-命令介绍" class="header-anchor">#</a> 2.1 命令介绍</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>$ configtxgen --help 
  <span class="token comment"># 指定生成的创始块文件的名字</span>
  <span class="token variable"><span class="token variable">`</span>-outputBlock string<span class="token variable">`</span></span>
  <span class="token comment"># 指定创建的通道的名字/ID</span>
  <span class="token variable"><span class="token variable">`</span>-channelID string<span class="token variable">`</span></span>
  <span class="token comment"># 指定生成的通道文件的名字</span>
  <span class="token variable"><span class="token variable">`</span>-outputCreateChannelTx string<span class="token variable">`</span></span>
  <span class="token comment"># 指定configtx.yaml的Profiles中的关键字</span>
  <span class="token variable"><span class="token variable">`</span>-profile string<span class="token variable">`</span></span>
  <span class="token comment"># 生成锚节点更新文件</span>
  <span class="token variable"><span class="token variable">`</span>-outputAnchorPeersUpdate string<span class="token variable">`</span></span>
  <span class="token comment"># 指定组织的名字</span>
  <span class="token variable"><span class="token variable">`</span>-asOrg string<span class="token variable">`</span></span>
</code></pre></div><h3 id="_2-2-配置文件编写"><a href="#_2-2-配置文件编写" class="header-anchor">#</a> 2.2 配置文件编写</h3> <div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token comment"># configtx.yaml</span>
<span class="token punctuation">---</span>
<span class="token comment">################################################################################</span>
<span class="token comment">#</span>
<span class="token comment">#   Section: Organizations</span>
<span class="token comment">#</span>
<span class="token comment">#   - This section defines the different organizational identities which will</span>
<span class="token comment">#   Section: Organizations</span>
<span class="token comment">#</span>
<span class="token comment">#   - This section defines the different organizational identities which will</span>
<span class="token comment">#   be referenced later in the configuration.</span>
<span class="token comment">#</span>
<span class="token comment">################################################################################</span>
<span class="token key atrule">Organizations</span><span class="token punctuation">:</span>

    <span class="token comment"># SampleOrg defines an MSP using the sampleconfig.  It should never be used</span>
    <span class="token comment"># in production but may be used as a template for other definitions</span>
    <span class="token punctuation">-</span> <span class="token important">&amp;OrdererOrg</span>
        <span class="token comment"># DefaultOrg defines the organization which is used in the sampleconfig</span>
        <span class="token comment"># of the fabric.git development environment</span>
        <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgOrderer

        <span class="token comment"># ID to load the MSP definition as</span>
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrgOrdererMSP

        <span class="token comment"># MSPDir is the filesystem path which contains the MSP configuration</span>
        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> crypto<span class="token punctuation">-</span>config/ordererOrganizations/itcast.com/msp

    <span class="token punctuation">-</span> <span class="token important">&amp;OrgGo</span>
        <span class="token comment"># DefaultOrg defines the organization which is used in the sampleconfig</span>
        <span class="token comment"># of the fabric.git development environment</span>
        <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgGo

        <span class="token comment"># ID to load the MSP definition as</span>
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrgGoMSP

        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> crypto<span class="token punctuation">-</span>config/peerOrganizations/orggo.itcast.com/msp

        <span class="token key atrule">AnchorPeers</span><span class="token punctuation">:</span>
            <span class="token comment"># AnchorPeers defines the location of peers which can be used</span>
            <span class="token comment"># for cross org gossip communication.  Note, this value is only</span>
            <span class="token comment"># encoded in the genesis block in the Application section context</span>
            <span class="token punctuation">-</span> <span class="token key atrule">Host</span><span class="token punctuation">:</span> peer0.orggo.itcast.com
              <span class="token key atrule">Port</span><span class="token punctuation">:</span> <span class="token number">7051</span>

    <span class="token punctuation">-</span> <span class="token important">&amp;OrgCpp</span>
        <span class="token comment"># DefaultOrg defines the organization which is used in the sampleconfig</span>
        <span class="token comment"># ID to load the MSP definition as</span>
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrgGoMSP

        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> crypto<span class="token punctuation">-</span>config/peerOrganizations/orggo.itcast.com/msp

        <span class="token key atrule">AnchorPeers</span><span class="token punctuation">:</span>
            <span class="token comment"># AnchorPeers defines the location of peers which can be used</span>
            <span class="token comment"># for cross org gossip communication.  Note, this value is only</span>
            <span class="token comment"># encoded in the genesis block in the Application section context</span>
            <span class="token punctuation">-</span> <span class="token key atrule">Host</span><span class="token punctuation">:</span> peer0.orggo.itcast.com
              <span class="token key atrule">Port</span><span class="token punctuation">:</span> <span class="token number">7051</span>

    <span class="token punctuation">-</span> <span class="token important">&amp;OrgCpp</span>
        <span class="token comment"># DefaultOrg defines the organization which is used in the sampleconfig</span>
        <span class="token comment"># of the fabric.git development environment</span>
        <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgCpp

        <span class="token comment"># ID to load the MSP definition as</span>
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrgCppMSP

        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> crypto<span class="token punctuation">-</span>config/peerOrganizations/orgcpp.itcast.com/msp

        <span class="token key atrule">AnchorPeers</span><span class="token punctuation">:</span>
            <span class="token comment"># AnchorPeers defines the location of peers which can be used</span>
            <span class="token comment"># for cross org gossip communication.  Note, this value is only</span>
            <span class="token comment"># encoded in the genesis block in the Application section context</span>
            <span class="token punctuation">-</span> <span class="token key atrule">Host</span><span class="token punctuation">:</span> peer1.orgcpp.itcast.com
              <span class="token key atrule">Port</span><span class="token punctuation">:</span> <span class="token number">7051</span>

<span class="token comment">################################################################################</span>
<span class="token comment">#</span>
<span class="token comment">#   SECTION: Capabilities</span>
<span class="token comment">#</span>
<span class="token comment">#   - This section defines the capabilities of fabric network. This is a new</span>
<span class="token comment">#   concept as of v1.1.0 and should not be utilized in mixed networks with</span>
<span class="token comment">#   v1.0.x peers and orderers.  Capabilities define features which must be</span>
<span class="token comment">#   present in a fabric binary for that binary to safely participate in the</span>
<span class="token comment">#   fabric network.  For instance, if a new MSP type is added, newer binaries</span>
<span class="token comment">#   might recognize and validate the signatures from this type, while older</span>
<span class="token comment">#   binaries without this support would be unable to validate those</span>
<span class="token comment">#   transactions.  This could lead to different versions of the fabric binaries</span>
<span class="token comment">#   having different world states.  Instead, defining a capability for a channel</span>
<span class="token comment">#   informs those binaries without this capability that they must cease</span>
<span class="token comment">#   processing transactions until they have been upgraded.  For v1.0.x if any</span>
<span class="token comment">#   capabilities are defined (including a map with all capabilities turned off)</span>
<span class="token comment">#   then the v1.0.x peer will deliberately crash.</span>
<span class="token comment">#</span>
<span class="token comment">################################################################################</span>
<span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
    <span class="token comment"># Channel capabilities apply to both the orderers and the peers and must be</span>
    <span class="token comment"># supported by both.  Set the value of the capability to true to require it.</span>
    <span class="token key atrule">Global</span><span class="token punctuation">:</span> <span class="token important">&amp;ChannelCapabilities</span>
        <span class="token comment"># V1.1 for Global is a catchall flag for behavior which has been</span>
        <span class="token comment"># determined to be desired for all orderers and peers running v1.0.x,</span>
        <span class="token comment"># but the modification of which would cause incompatibilities.  Users</span>
        <span class="token comment"># should leave this flag set to true.</span>
        <span class="token key atrule">V1_1</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>

    <span class="token comment"># Orderer capabilities apply only to the orderers, and may be safely</span>
    <span class="token comment"># manipulated without concern for upgrading peers.  Set the value of the</span>
    <span class="token comment"># capability to true to require it.</span>
    <span class="token key atrule">Orderer</span><span class="token punctuation">:</span> <span class="token important">&amp;OrdererCapabilities</span>
        <span class="token comment"># V1.1 for Order is a catchall flag for behavior which has been</span>
        <span class="token comment"># determined to be desired for all orderers running v1.0.x, but the</span>
        <span class="token comment"># modification of which  would cause incompatibilities.  Users should</span>
        <span class="token comment"># leave this flag set to true.</span>
        <span class="token key atrule">V1_1</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>

    <span class="token comment"># Application capabilities apply only to the peer network, and may be safely</span>
    <span class="token comment"># manipulated without concern for upgrading orderers.  Set the value of the</span>
    <span class="token comment"># capability to true to require it.</span>
    <span class="token key atrule">Application</span><span class="token punctuation">:</span> <span class="token important">&amp;ApplicationCapabilities</span>
        <span class="token comment"># V1.2 for Application is a catchall flag for behavior which has been</span>
        <span class="token comment"># determined to be desired for all peers running v1.0.x, but the</span>
        <span class="token comment"># modification of which would cause incompatibilities.  Users should</span>
        <span class="token comment"># leave this flag set to true.</span>
        <span class="token key atrule">V1_2</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>

<span class="token comment">################################################################################</span>
<span class="token comment">#</span>
<span class="token comment">#   SECTION: Application</span>
<span class="token comment">#</span>
<span class="token comment">#   - This section defines the values to encode into a config transaction or</span>
<span class="token comment">#   genesis block for application related parameters</span>
<span class="token comment">#</span>
<span class="token comment">################################################################################</span>
<span class="token key atrule">Application</span><span class="token punctuation">:</span> <span class="token important">&amp;ApplicationDefaults</span>

    <span class="token comment"># Organizations is the list of orgs which are defined as participants on</span>
    <span class="token comment"># the application side of the network</span>
    <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>

<span class="token comment">################################################################################</span>
<span class="token comment">#</span>
<span class="token comment">#   SECTION: Orderer</span>
<span class="token comment">#</span>
<span class="token comment">#   - This section defines the values to encode into a config transaction or</span>
<span class="token comment">#   genesis block for orderer related parameters</span>
<span class="token comment">#</span>
<span class="token comment">################################################################################</span>
<span class="token key atrule">Orderer</span><span class="token punctuation">:</span> <span class="token important">&amp;OrdererDefaults</span>

    <span class="token comment"># Orderer Type: The orderer implementation to start</span>
    <span class="token comment"># Available types are &quot;solo&quot; and &quot;kafka&quot;</span>
    <span class="token key atrule">OrdererType</span><span class="token punctuation">:</span> solo

    <span class="token key atrule">Addresses</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> orderer.itcast.com<span class="token punctuation">:</span><span class="token number">7050</span>

<span class="token key atrule">Orderer</span><span class="token punctuation">:</span> <span class="token important">&amp;OrdererDefaults</span>

    <span class="token comment"># Orderer Type: The orderer implementation to start</span>
    <span class="token comment"># Available types are &quot;solo&quot; and &quot;kafka&quot;</span>
    <span class="token key atrule">OrdererType</span><span class="token punctuation">:</span> solo

    <span class="token key atrule">Addresses</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> orderer.itcast.com<span class="token punctuation">:</span><span class="token number">7050</span>

    <span class="token comment"># Batch Timeout: The amount of time to wait before creating a batch</span>
    <span class="token key atrule">BatchTimeout</span><span class="token punctuation">:</span> 2s

    <span class="token comment"># Batch Size: Controls the number of messages batched into a block</span>
    <span class="token key atrule">BatchSize</span><span class="token punctuation">:</span>

        <span class="token comment"># Max Message Count: The maximum number of messages to permit in a batch</span>
        <span class="token key atrule">MaxMessageCount</span><span class="token punctuation">:</span> <span class="token number">100</span>

        <span class="token comment"># Absolute Max Bytes: The absolute maximum number of bytes allowed for</span>
        <span class="token comment"># the serialized messages in a batch.</span>
        <span class="token key atrule">AbsoluteMaxBytes</span><span class="token punctuation">:</span> 32 MB

        <span class="token comment"># Preferred Max Bytes: The preferred maximum number of bytes allowed for</span>
        <span class="token comment"># the serialized messages in a batch. A message larger than the preferred</span>
        <span class="token comment"># max bytes will result in a batch larger than preferred max bytes.</span>
        <span class="token key atrule">PreferredMaxBytes</span><span class="token punctuation">:</span> 512 KB

    <span class="token key atrule">Kafka</span><span class="token punctuation">:</span>
        <span class="token comment"># Brokers: A list of Kafka brokers to which the orderer connects</span>
        <span class="token comment"># NOTE: Use IP:port notation</span>
        <span class="token key atrule">Brokers</span><span class="token punctuation">:</span>
            <span class="token punctuation">-</span> 127.0.0.1<span class="token punctuation">:</span><span class="token number">9092</span>

    <span class="token comment"># Organizations is the list of orgs which are defined as participants on</span>
    <span class="token comment"># the orderer side of the network</span>
    <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>

<span class="token comment">################################################################################</span>
<span class="token comment">#</span>
<span class="token comment">#   Profile</span>
<span class="token comment">#</span>
<span class="token comment">#   - Different configuration profiles may be encoded here to be specified</span>
<span class="token comment">#   as parameters to the configtxgen tool</span>
<span class="token comment">#</span>
<span class="token comment">################################################################################</span>
<span class="token key atrule">Profiles</span><span class="token punctuation">:</span>

    <span class="token key atrule">Genesis</span><span class="token punctuation">:</span>
        <span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
            <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*ChannelCapabilities</span>
        <span class="token key atrule">Orderer</span><span class="token punctuation">:</span>
            <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*OrdererDefaults</span>
            <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
                <span class="token punctuation">-</span> <span class="token important">*OrdererOrg</span>
            <span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
                <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*OrdererCapabilities</span>
        <span class="token key atrule">Consortiums</span><span class="token punctuation">:</span>
            <span class="token key atrule">SampleConsortium</span><span class="token punctuation">:</span>
                <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
                    <span class="token punctuation">-</span> <span class="token important">*OrgGo</span>
                    <span class="token punctuation">-</span> <span class="token important">*OrgCpp</span>
    <span class="token key atrule">Channel</span><span class="token punctuation">:</span>
        <span class="token key atrule">Consortium</span><span class="token punctuation">:</span> SampleConsortium
        <span class="token key atrule">Application</span><span class="token punctuation">:</span>
            <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*ApplicationDefaults</span>
            <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
                <span class="token punctuation">-</span> <span class="token important">*OrgGo</span>
                <span class="token punctuation">-</span> <span class="token important">*OrgCpp</span>
            <span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
                <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*ApplicationCapabilities</span>
</code></pre></div><h3 id="_2-3-文件生成"><a href="#_2-3-文件生成" class="header-anchor">#</a> 2.3 文件生成</h3> <ul><li><p>生成创始块文件</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 创始块文件的名字自己指定, 后缀 block</span>
$ configtxgen -profile Genesis -outputBlock genesis.block
</code></pre></div></li> <li><p>生成通道文件</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 通道文件名字字节指定, 后缀 tx</span>
<span class="token comment"># -channelID 对应的通道名, 如果没有指定, 会使用默认的名字 -&gt; mychannel</span>
$ configtxgen -profile Channel -outputCreateChannelTx channel.tx -channelID itcastchannel
</code></pre></div></li> <li><p>生成锚节点更新文件 -&gt; <font color="red">这个操作可选, 不是必须做的, 锚节点发生变化, 必须要做</font></p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ configtxgen -profile Channel -outputAnchorPeersUpdate goAnchorPeer.tx -channelID itcastchannel -asOrg OrgGo<span class="token punctuation">[</span>这是组织名<span class="token punctuation">]</span>
<span class="token comment"># 更新cpp组织</span>
configtxgen -profile Channel -outputAnchorPeersUpdate cppAnchorPeer.tx -channelID itcastchannel -asOrg OrgCpp
</code></pre></div></li></ul> <h2 id="_3-docker-compose启动容器"><a href="#_3-docker-compose启动容器" class="header-anchor">#</a> 3. docker-compose启动容器</h2> <h3 id="_3-1-orderer节点使用的环境变量"><a href="#_3-1-orderer节点使用的环境变量" class="header-anchor">#</a> 3.1 orderer节点使用的环境变量</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>ORDERER_GENERAL_LOGLEVEL
 - 日志级别, 级别越高, 写的日志越少
 - `critical <span class="token operator">|</span> error <span class="token operator">|</span> warning <span class="token operator">|</span> notice <span class="token operator">|</span> info <span class="token operator">|</span> debug
ORDERER_GENERAL_LISTENADDRESS
 - 当前orderer节点监听的地址, 指定当前orderer节点对应的主机地址即可, 也可以写0.0.0.0 <span class="token operator">==</span> 自动绑定
ORDERER_GENERAL_GENESISMETHOD
 - 生成创始区块的时候, 数据来源
 - 帮赋值为 file, 数据来自于文件
ORDERER_GENERAL_GENESISFILE
 - 创始块文件, 从宿主机挂载到orderer节点的
ORDERER_GENERAL_LOCALMSPID
 - 当前orderer节点的组织ID, 从configtx.yaml中找
ORDERER_GENERAL_LOCALMSPDIR
 - 当前orderer节点的msp账号目录
 - crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp
ORDERER_GENERAL_TLS_ENABLED
 - 通信过程中是否需要加密, 值: true/false
ORDERER_GENERAL_TLS_PRIVATEKEY
 - TLS通信使用的私钥
ORDERER_GENERAL_TLS_CERTIFICATE
 - TLS通信的证书文件
ORDERER_GENERAL_TLS_ROOTCAS
 - TLS通信的根证书
查找目录参考:
crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls
</code></pre></div><h3 id="_3-2-peer节点使用的环境变量"><a href="#_3-2-peer节点使用的环境变量" class="header-anchor">#</a> 3.2 peer节点使用的环境变量</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>CORE_PEER_ID
 - 当前peer节点的名字, 随便起名
CORE_PEER_ADDRESS
 - 当前peer节点的地址, 书写格式: IP/域名:端口<span class="token punctuation">(</span><span class="token number">7051</span><span class="token punctuation">)</span>
CORE_PEER_GOSSIP_BOOTSTRAP
 - 当前节点连接那个节点进行数据传播
 - 值是一个节点的地址: ip/域名:端口
 - 如果当前peer节点是组织中启动的第一个节点: 需要指定自己的地址
 - 如果当前peer节点不是组织中启动的第一个节点: 可以是自己, 或者是当前组织中任意其他节点
CORE_PEER_GOSSIP_EXTERNALENDPOINT
 - 设置当前节点是否被外部感知
 - 值就是当前节点的地址: IP/域名:端口<span class="token punctuation">(</span><span class="token number">7051</span><span class="token punctuation">)</span>
CORE_PEER_LOCALMSPID
 - 当前节点所属的组织的组织ID
 - 在configtx.yaml
CORE_VM_ENDPOINT
 - 对应是本地的一个套接字文件: docker.sock, 这个文件是给docker服务器使用的
 - 值是固定的: unix:///host/var/run/docker.sock
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE
 - 容器启动所在的网络的名字
 - 通过docker network <span class="token function">ls</span> 查看
CORE_LOGGING_LEVEL
 - 日志级别
CORE_PEER_TLS_ENABLED
 - 是否使用tls加密
CORE_PEER_GOSSIP_USELEADERELECTION
 - 是不是自动选择leader节点
 - leader节点: 代表组织和orderer节点通信
 - 选择leader节点有两种方式: 
    - 系统选择: 选择的挂了, 重新选择一个
    - 手动指定: 指定的挂了, leader节点就没有了
 - true: 系统选择, false: 手动指定
CORE_PEER_GOSSIP_ORGLEADER
 - 当前peer节点是不是leader节点
 - 值true/false
 - 如果CORE_PEER_GOSSIP_USELEADERELECTION<span class="token operator">=</span>true
  	CORE_PEER_GOSSIP_ORGLEADER <span class="token operator">=</span> <span class="token boolean">false</span>
 - 如果CORE_PEER_GOSSIP_USELEADERELECTION<span class="token operator">=</span>false
    CORE_PEER_GOSSIP_ORGLEADER <span class="token operator">=</span> <span class="token boolean">true</span> -<span class="token operator">&gt;</span> 在某一个节点中指定为true, 其余false
CORE_PEER_PROFILE_ENABLED
 - 值为true/fasle
 - 在peer内部又一PROFILE服务器, 指定这个服务器默认开启还是关闭, 一般设置为true
CORE_PEER_TLS_CERT_FILE
 - tls通信使用的证书
CORE_PEER_TLS_KEY_FILE
 - tls通信私钥文件
CORE_PEER_TLS_ROOTCERT_FILE
 - tls根证书文件
</code></pre></div><h3 id="_3-3-客户端节点使用的环境变量"><a href="#_3-3-客户端节点使用的环境变量" class="header-anchor">#</a> 3.3 客户端节点使用的环境变量</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>GOPATH
 - 在客户端容器中 go 的工作目录
CORE_VM_ENDPOINT
 - 对用宿主机的本地套接字文件 docker.sock
 - unix:///host/var/run/docker.sock, 值 是固定的
CORE_LOGGING_LEVEL
 - 客户端日志级别
CORE_PEER_ID
 - 当前客户端节点的名字, 字节起名
CORE_PEER_ADDRESS
 - 当前客户端要连接的peer节点的地址
 - IP/域名:端口<span class="token punctuation">[</span><span class="token number">7051</span><span class="token punctuation">]</span>
CORE_PEER_LOCALMSPID
 - 要连接的peer节点所属的组织的组织ID
CORE_PEER_TLS_ENABLED
 - 通信的时候是不是使用tls加密
CORE_PEER_TLS_CERT_FILE
 - tls通信的证书
CORE_PEER_TLS_KEY_FILE
 - tls通信使用的私钥文件
CORE_PEER_TLS_ROOTCERT_FILE
 - tls通信根证书文件
CORE_PEER_MSPCONFIGPATH
 - 访问peer节点对用的用户的账号信息
 - 示例目录: crypto-config/peerOrganizations/orggo.example.com/users/Admin@orggo.example.com/msp
</code></pre></div><h3 id="_3-4-配置文件编写"><a href="#_3-4-配置文件编写" class="header-anchor">#</a> 3.4 配置文件编写</h3> <div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token comment"># docker-compose.yaml</span>
<span class="token comment"># Copyright IBM Corp. All Rights Reserved.</span>
<span class="token comment">#</span>
<span class="token comment"># SPDX-License-Identifier: Apache-2.0</span>
<span class="token comment">#</span>

<span class="token key atrule">version</span><span class="token punctuation">:</span> <span class="token string">'2'</span>

<span class="token key atrule">volumes</span><span class="token punctuation">:</span>
  <span class="token key atrule">orderer.itcast.com</span><span class="token punctuation">:</span>
  <span class="token key atrule">peer0.orggo.itcast.com</span><span class="token punctuation">:</span>
  <span class="token key atrule">peer1.orggo.itcast.com</span><span class="token punctuation">:</span>
  <span class="token key atrule">peer0.orgcpp.itcast.com</span><span class="token punctuation">:</span>
  <span class="token key atrule">peer1.orgcpp.itcast.com</span><span class="token punctuation">:</span>

<span class="token key atrule">networks</span><span class="token punctuation">:</span>
  <span class="token key atrule">byfn</span><span class="token punctuation">:</span>

<span class="token key atrule">services</span><span class="token punctuation">:</span>

  <span class="token key atrule">orderer.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span>   docker<span class="token punctuation">-</span>compose<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> orderer.itcast.com
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> orderer.itcast.com
    <span class="token key atrule">networks</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> byfn

  <span class="token key atrule">peer0.orggo.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer0.orggo.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span>  docker<span class="token punctuation">-</span>compose<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer0.orggo.itcast.com
    <span class="token key atrule">networks</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> byfn

  <span class="token key atrule">peer1.orggo.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer1.orggo.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span>  docker<span class="token punctuation">-</span>compose<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer1.orggo.itcast.com
    <span class="token key atrule">networks</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> byfn

  <span class="token key atrule">peer0.orgcpp.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer0.orgcpp.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span>  docker<span class="token punctuation">-</span>compose<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer0.orgcpp.itcast.com
    <span class="token key atrule">networks</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> byfn

  <span class="token key atrule">peer1.orgcpp.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer1.orgcpp.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span>  docker<span class="token punctuation">-</span>compose<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer1.orgcpp.itcast.com
    <span class="token key atrule">networks</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> byfn

  <span class="token key atrule">cli</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> cli
    <span class="token key atrule">image</span><span class="token punctuation">:</span> hyperledger/fabric<span class="token punctuation">-</span>tools
    <span class="token key atrule">tty</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
    <span class="token key atrule">stdin_open</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> GOPATH=/opt/gopath
      <span class="token punctuation">-</span> CORE_VM_ENDPOINT=unix<span class="token punctuation">:</span>///host/var/run/docker.sock
      <span class="token comment">#- CORE_LOGGING_LEVEL=DEBUG</span>
      <span class="token punctuation">-</span> CORE_LOGGING_LEVEL=INFO
      <span class="token punctuation">-</span> CORE_PEER_ID=cli
      <span class="token punctuation">-</span> CORE_PEER_ADDRESS=peer0.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_LOCALMSPID=OrgGoMSP
      <span class="token punctuation">-</span> CORE_PEER_TLS_ENABLED=true
      <span class="token punctuation">-</span> CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/server.crt
      <span class="token punctuation">-</span> CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/server.key
      <span class="token punctuation">-</span> CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/ca.crt
      <span class="token punctuation">-</span> CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/users/Admin@orggo.itcast.com/msp
    <span class="token key atrule">working_dir</span><span class="token punctuation">:</span> /opt/gopath/src/github.com/hyperledger/fabric/peer
    <span class="token key atrule">command</span><span class="token punctuation">:</span> /bin/bash
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> /var/run/<span class="token punctuation">:</span>/host/var/run/
        <span class="token punctuation">-</span> ./chaincode/<span class="token punctuation">:</span>/opt/gopath/src/github.com/chaincode
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config<span class="token punctuation">:</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
        <span class="token punctuation">-</span> ./channel<span class="token punctuation">-</span>artifacts<span class="token punctuation">:</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/channel<span class="token punctuation">-</span>artifacts
    <span class="token key atrule">depends_on</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> orderer.itcast.com
      <span class="token punctuation">-</span> peer0.orggo.itcast.com
      <span class="token punctuation">-</span> peer1.orggo.itcast.com
      <span class="token punctuation">-</span> peer0.orgcpp.itcast.com
      <span class="token punctuation">-</span> peer1.orgcpp.itcast.com
    <span class="token key atrule">networks</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> byfn

</code></pre></div><div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token comment"># docker-compose-base.yaml</span>
<span class="token comment"># Copyright IBM Corp. All Rights Reserved.</span>
<span class="token comment">#</span>
<span class="token comment"># SPDX-License-Identifier: Apache-2.0</span>
<span class="token comment">#</span>

<span class="token key atrule">version</span><span class="token punctuation">:</span> <span class="token string">'2'</span>

<span class="token key atrule">services</span><span class="token punctuation">:</span>

  <span class="token key atrule">orderer.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> orderer.itcast.com
    <span class="token key atrule">image</span><span class="token punctuation">:</span> hyperledger/fabric<span class="token punctuation">-</span>orderer
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> ORDERER_GENERAL_LOGLEVEL=INFO
      <span class="token punctuation">-</span> ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      <span class="token punctuation">-</span> ORDERER_GENERAL_GENESISMETHOD=file
      <span class="token punctuation">-</span> ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      <span class="token punctuation">-</span> ORDERER_GENERAL_LOCALMSPID=OrgOrdererMSP
      <span class="token punctuation">-</span> ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      <span class="token comment"># enabled TLS</span>
      <span class="token punctuation">-</span> ORDERER_GENERAL_TLS_ENABLED=true
      <span class="token punctuation">-</span> ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      <span class="token punctuation">-</span> ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      <span class="token punctuation">-</span> ORDERER_GENERAL_TLS_ROOTCAS=<span class="token punctuation">[</span>/var/hyperledger/orderer/tls/ca.crt<span class="token punctuation">]</span>
    <span class="token key atrule">working_dir</span><span class="token punctuation">:</span> /opt/gopath/src/github.com/hyperledger/fabric
    <span class="token key atrule">command</span><span class="token punctuation">:</span> orderer
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
    <span class="token punctuation">-</span> ./channel<span class="token punctuation">-</span>artifacts/genesis.block<span class="token punctuation">:</span>/var/hyperledger/orderer/orderer.genesis.block
    <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp<span class="token punctuation">:</span>/var/hyperledger/orderer/msp
    <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/tls/<span class="token punctuation">:</span>/var/hyperledger/orderer/tls
    <span class="token punctuation">-</span> orderer.itcast.com<span class="token punctuation">:</span>/var/hyperledger/production/orderer
    <span class="token key atrule">ports</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> 7050<span class="token punctuation">:</span><span class="token number">7050</span>

  <span class="token key atrule">peer0.orggo.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer0.orggo.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> CORE_PEER_ID=peer0.orggo.itcast.com
      <span class="token punctuation">-</span> CORE_PEER_ADDRESS=peer0.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_LOCALMSPID=OrgGoMSP
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> /var/run/<span class="token punctuation">:</span>/host/var/run/
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/msp<span class="token punctuation">:</span>/etc/hyperledger/fabric/msp
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls<span class="token punctuation">:</span>/etc/hyperledger/fabric/tls
        <span class="token punctuation">-</span> peer0.orggo.itcast.com<span class="token punctuation">:</span>/var/hyperledger/production
    <span class="token key atrule">ports</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> 7051<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> 7053<span class="token punctuation">:</span><span class="token number">7053</span>

  <span class="token key atrule">peer1.orggo.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer1.orggo.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> CORE_PEER_ID=peer1.orggo.itcast.com
      <span class="token punctuation">-</span> CORE_PEER_ADDRESS=peer1.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orggo.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_LOCALMSPID=OrgGoMSP
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> /var/run/<span class="token punctuation">:</span>/host/var/run/
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orggo.itcast.com/peers/peer1.orggo.itcast.com/msp<span class="token punctuation">:</span>/etc/hyperledger/fabric/msp
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orggo.itcast.com/peers/peer1.orggo.itcast.com/tls<span class="token punctuation">:</span>/etc/hyperledger/fabric/tls
        <span class="token punctuation">-</span> peer1.orggo.itcast.com<span class="token punctuation">:</span>/var/hyperledger/production

    <span class="token key atrule">ports</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> 8051<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> 8053<span class="token punctuation">:</span><span class="token number">7053</span>

  <span class="token key atrule">peer0.orgcpp.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer0.orgcpp.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> CORE_PEER_ID=peer0.orgcpp.itcast.com
      <span class="token punctuation">-</span> CORE_PEER_ADDRESS=peer0.orgcpp.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.orgcpp.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orgcpp.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_LOCALMSPID=OrgCppMSP
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> /var/run/<span class="token punctuation">:</span>/host/var/run/
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orgcpp.itcast.com/peers/peer0.orgcpp.itcast.com/msp<span class="token punctuation">:</span>/etc/hyperledger/fabric/msp
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orgcpp.itcast.com/peers/peer0.orgcpp.itcast.com/tls<span class="token punctuation">:</span>/etc/hyperledger/fabric/tls
        <span class="token punctuation">-</span> peer0.orgcpp.itcast.com<span class="token punctuation">:</span>/var/hyperledger/production
    <span class="token key atrule">ports</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> 9051<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> 9053<span class="token punctuation">:</span><span class="token number">7053</span>

  <span class="token key atrule">peer1.orgcpp.itcast.com</span><span class="token punctuation">:</span>
    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> peer1.orgcpp.itcast.com
    <span class="token key atrule">extends</span><span class="token punctuation">:</span>
      <span class="token key atrule">file</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base.yaml
      <span class="token key atrule">service</span><span class="token punctuation">:</span> peer<span class="token punctuation">-</span>base
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> CORE_PEER_ID=peer1.orgcpp.itcast.com
      <span class="token punctuation">-</span> CORE_PEER_ADDRESS=peer1.orgcpp.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.orgcpp.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_BOOTSTRAP=peer0.orgcpp.itcast.com<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> CORE_PEER_LOCALMSPID=OrgCppMSP
    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> /var/run/<span class="token punctuation">:</span>/host/var/run/
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orgcpp.itcast.com/peers/peer1.orgcpp.itcast.com/msp<span class="token punctuation">:</span>/etc/hyperledger/fabric/msp
        <span class="token punctuation">-</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/orgcpp.itcast.com/peers/peer1.orgcpp.itcast.com/tls<span class="token punctuation">:</span>/etc/hyperledger/fabric/tls
        <span class="token punctuation">-</span> peer1.orgcpp.itcast.com<span class="token punctuation">:</span>/var/hyperledger/production
    <span class="token key atrule">ports</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> 10051<span class="token punctuation">:</span><span class="token number">7051</span>
      <span class="token punctuation">-</span> 10053<span class="token punctuation">:</span><span class="token number">7053</span>

</code></pre></div><div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token comment"># peer-base.yaml</span>
<span class="token comment"># Copyright IBM Corp. All Rights Reserved.</span>
<span class="token comment">#</span>
<span class="token comment"># SPDX-License-Identifier: Apache-2.0</span>
<span class="token comment">#</span>

<span class="token key atrule">version</span><span class="token punctuation">:</span> <span class="token string">'2'</span>

<span class="token key atrule">services</span><span class="token punctuation">:</span>
  <span class="token key atrule">peer-base</span><span class="token punctuation">:</span>
    <span class="token key atrule">image</span><span class="token punctuation">:</span> hyperledger/fabric<span class="token punctuation">-</span>peer
    <span class="token key atrule">environment</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> CORE_VM_ENDPOINT=unix<span class="token punctuation">:</span>///host/var/run/docker.sock
      <span class="token comment"># the following setting starts chaincode containers on the same</span>
      <span class="token comment"># bridge network as the peers</span>
      <span class="token comment"># https://docs.docker.com/compose/networking/</span>
      <span class="token punctuation">-</span> CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=$<span class="token punctuation">{</span>COMPOSE_PROJECT_NAME<span class="token punctuation">}</span>_byfn
      <span class="token punctuation">-</span> CORE_LOGGING_LEVEL=INFO
      <span class="token comment">#- CORE_LOGGING_LEVEL=DEBUG</span>
      <span class="token punctuation">-</span> CORE_PEER_TLS_ENABLED=true
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_USELEADERELECTION=true
      <span class="token punctuation">-</span> CORE_PEER_GOSSIP_ORGLEADER=false
      <span class="token punctuation">-</span> CORE_PEER_PROFILE_ENABLED=true
      <span class="token punctuation">-</span> CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      <span class="token punctuation">-</span> CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      <span class="token punctuation">-</span> CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt
    <span class="token key atrule">working_dir</span><span class="token punctuation">:</span> /opt/gopath/src/github.com/hyperledger/fabric/peer
    <span class="token key atrule">command</span><span class="token punctuation">:</span> peer node start

</code></pre></div><h3 id="_3-5-启动容器"><a href="#_3-5-启动容器" class="header-anchor">#</a> 3.5 启动容器</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 启动</span>
$ docker-compose up -d
Creating network <span class="token string">&quot;itcast_byfn&quot;</span> with the default driver
Creating volume <span class="token string">&quot;itcast_peer1.orggo.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer0.orgcpp.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_orderer.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer0.orggo.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer1.orgcpp.itcast.com&quot;</span> with default driver
Creating peer0.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating peer1.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating peer0.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating peer1.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating orderer.itcast.com      <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating cli                     <span class="token punctuation">..</span>. <span class="token keyword">done</span>
<span class="token comment"># 容器查看</span>
$ docker-compose <span class="token function">ps</span>
         Name                 Command       State                        Ports                      
----------------------------------------------------------------------------------------------------
cli                       /bin/bash         Up                                                      
orderer.itcast.com        orderer           Up      <span class="token number">0.0</span>.0.0:7050-<span class="token operator">&gt;</span><span class="token number">7050</span>/tcp                          
peer0.orgcpp.itcast.com   peer node start   Up      <span class="token number">0.0</span>.0.0:9051-<span class="token operator">&gt;</span><span class="token number">7051</span>/tcp, <span class="token number">0.0</span>.0.0:9053-<span class="token operator">&gt;</span><span class="token number">7053</span>/tcp  
peer0.orggo.itcast.com    peer node start   Up      <span class="token number">0.0</span>.0.0:7051-<span class="token operator">&gt;</span><span class="token number">7051</span>/tcp, <span class="token number">0.0</span>.0.0:7053-<span class="token operator">&gt;</span><span class="token number">7053</span>/tcp  
peer1.orgcpp.itcast.com   peer node start   Up      <span class="token number">0.0</span>.0.0:10051-<span class="token operator">&gt;</span><span class="token number">7051</span>/tcp, <span class="token number">0.0</span>.0.0:10053-<span class="token operator">&gt;</span><span class="token number">7053</span>/tcp
peer1.orggo.itcast.com    peer node start   Up      <span class="token number">0.0</span>.0.0:8051-<span class="token operator">&gt;</span><span class="token number">7051</span>/tcp, <span class="token number">0.0</span>.0.0:8053-<span class="token operator">&gt;</span><span class="token number">7053</span>/tcp

<span class="token comment"># 关闭</span>
$ docker-compose down -v   
Stopping cli                     <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Stopping peer1.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Stopping orderer.itcast.com      <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Stopping peer0.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Stopping peer1.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Stopping peer0.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing cli                     <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing peer1.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing orderer.itcast.com      <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing peer0.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing peer1.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing peer0.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Removing network itcast_byfn
Removing volume itcast_peer1.orggo.itcast.com
Removing volume itcast_peer0.orgcpp.itcast.com
Removing volume itcast_orderer.itcast.com
Removing volume itcast_peer0.orggo.itcast.com
Removing volume itcast_peer1.orgcpp.itcast.com
go@kevin:~/itcast$ docker-compose up -d
Creating network <span class="token string">&quot;itcast_byfn&quot;</span> with the default driver
Creating volume <span class="token string">&quot;itcast_peer1.orggo.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer0.orgcpp.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_orderer.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer0.orggo.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer1.orgcpp.itcast.com&quot;</span> with default driver
Creating peer0.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating peer1.orgcpp.itcast.com <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating peer0.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating peer1.orggo.itcast.com  <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating orderer.itcast.com      <span class="token punctuation">..</span>. <span class="token keyword">done</span>
Creating cli                     <span class="token punctuation">..</span>. <span class="token keyword">done</span>
</code></pre></div><div class="language-shell extra-class"><pre class="language-shell"><code>WARNING: The COMPOSE_PROJECT_NAME variable is not set. Defaulting to a blank string.
Creating network <span class="token string">&quot;itcast_byfn&quot;</span> with the default driver
Creating volume <span class="token string">&quot;itcast_peer1.orggo.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer0.orgcpp.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_orderer.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer0.orggo.itcast.com&quot;</span> with default driver
Creating volume <span class="token string">&quot;itcast_peer1.orgcpp.itcast.com&quot;</span> with default driver
-- 创建的网络命名:
 - 根据当前docker-compose启动的目录来对网络进行命名的
<span class="token assign-left variable">CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE</span><span class="token operator">=</span>itcast_byfn  -<span class="token operator">&gt;</span> 创建出来的网络名
</code></pre></div><h2 id="_4-peer操作"><a href="#_4-peer操作" class="header-anchor">#</a> 4. Peer操作</h2> <blockquote><p>对peer节点的操作, 都是通过客户端连接对应的peer节点,</p> <ul><li>完成通道的创建</li> <li>加入通道</li> <li>安装链码</li> <li>初始化链码</li> <li>链码调用</li> <li>数据查询</li></ul> <p>而不是直接进入到peer节点上进行操作的</p> <p>docker exec -it peer节点容器名 bash   -&gt; 不这样操作</p> <p>首先要进入到客户端容器中</p> <p>docker exec -it cli bash</p> <p>通过客户端连接到任意一个peer节点上就可以进行创建通道的操作了</p></blockquote> <h3 id="_4-1-创建通道"><a href="#_4-1-创建通道" class="header-anchor">#</a> 4.1 创建通道</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 通道创建操作, 只需要操作一次</span>
<span class="token comment"># 创建通道的操作执行一次就可以了, 执行完成之后, 会生成一个通道文件</span>
$ peer channel create <span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	<span class="token variable"><span class="token variable">`</span>-o, --orderer: orderer节点的地址
	<span class="token variable">`</span></span>-c, --channelID: 要创建的通道的ID, 必须小写, 在250个字符以内
	<span class="token variable"><span class="token variable">`</span>-f, --file: 由configtxgen 生成的通道文件, 用于提交给orderer
	-t, --timeout: 创建通道的超时时长, 默认为5s
	<span class="token variable">`</span></span>--tls: 通信时是否使用tls加密
	<span class="token variable"><span class="token variable">`</span>--cafile: 当前orderer节点pem格式的tls证书文件, 要使用绝对路径.
<span class="token comment"># orderer节点pem格式的tls证书文件路径参考: </span>
crypto-config/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem

$ peer channel create -o orderer节点地址<span class="token punctuation">[</span>orderer.itcast.com:7050<span class="token punctuation">]</span> -c itcastchannel -f channel.tx --tls <span class="token boolean">true</span> --cafile 
	-o: orderer节点地址, orderer.itcast.com:7050
	-c: itcastchannel
	-f: 通道文件, ./channel-artifacts/channel.tx -<span class="token operator">&gt;</span> 容器路径
	--tls: true/false
	--cafile: 根据容器路径进行查找, 要用绝对路径

<span class="token assign-left variable">CAFILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem
$ peer channel create -o orderer.itcast.com:7050 -c itcastchannel -f ./channel-artifacts/channel.tx --tls <span class="token boolean">true</span> --cafile $CAFILE

$ root@f409ce0ade91:/opt/gopath/src/github.com/hyperledger/fabric/peer<span class="token comment"># ls</span>
channel-artifacts  crypto  <span class="token variable">`</span></span>itcastchannel.block -<span class="token operator">&gt;</span> 通道创建成功之后, 生成的文件
</code></pre></div><h3 id="_4-2-加入通道"><a href="#_4-2-加入通道" class="header-anchor">#</a> 4.2 加入通道</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 当前网络中所有peer节点都需要加入到通道中, 都是通过客户端操作来完成的</span>
$ peer channel join<span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	`-b, --blockpath: 通过 peer channel create 命令生成的通道文件 
$ peer channel <span class="token function">join</span> -b itcastchannel.block -<span class="token operator">&gt;</span> 当前节点加入到了通道中
</code></pre></div><h3 id="_4-3-更新锚节点"><a href="#_4-3-更新锚节点" class="header-anchor">#</a> 4.3 更新锚节点</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 当前组织的锚节点发生变化的时候, 才需要更新</span>
<span class="token comment"># 每个组织的锚节点更新需要依次做</span>
$ peer channel update <span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	<span class="token variable"><span class="token variable">`</span>-o, --orderer: orderer节点的地址
	<span class="token variable">`</span></span>-c, --channelID: 要创建的通道的ID, 必须小写, 在250个字符以内
	<span class="token variable"><span class="token variable">`</span>-f, --file: 由configtxgen 生成的组织锚节点文件, 用于提交给orderer
	<span class="token variable">`</span></span>--tls: 通信时是否使用tls加密
	`--cafile: 当前orderer节点pem格式的tls证书文件, 要使用绝对路径.
$ peer channel update -o orderer.itcast.com:7050 -c itcastchannel -f ./channel-artifacts/goAnchorPeer.tx --tls <span class="token boolean">true</span> --cafile <span class="token variable">$CAFILE</span>
</code></pre></div><h3 id="_4-4-安装链码"><a href="#_4-4-安装链码" class="header-anchor">#</a> 4.4 安装链码</h3> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 每个peer节点都需要安装链码, 链码安装完成, peer节点才能根据业务逻辑对账本进程操作</span>
$ peer chaincode <span class="token function">install</span> <span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	-c, --ctor: JSON格式的构造参数, 默认是<span class="token string">&quot;{}&quot;</span>
	<span class="token variable"><span class="token variable">`</span>-l, --lang: 编写chaincode的编程语言, 默认值是 golang
	<span class="token variable">`</span></span>-n, --name: chaincode的名字
	<span class="token variable"><span class="token variable">`</span>-p, --path: chaincode源代码的目录, 从 $GOPATH/src 路径后开始写
	<span class="token variable">`</span></span>-v, --version: 当前操作的chaincode的版本, 适用这些命令install/instantiate/upgrade
$ peer chaincode <span class="token function">install</span> -l golang -n itcastcc -p github.com/chaincode -v v1.0
</code></pre></div><h3 id="_4-5-链码初始化"><a href="#_4-5-链码初始化" class="header-anchor">#</a> 4.5 链码初始化</h3> <blockquote><p>背书策略:</p> <ul><li>背书: 交易被确认的过程</li> <li>fabric网络中交易执行需要先模拟交易, 模拟交易的过程就是背书的过程, 这个过程会按照指定的背书策略来执行</li></ul> <p>两个组织,</p> <ul><li>go
<ul><li>peer0.orggo.itcast.com</li> <li>peer1.orggo.itcast.com</li></ul></li> <li>cpp
<ul><li>peer0.orgcpp.itcast.com</li> <li>peer1.orgcpp.itcast.com</li></ul></li></ul> <p>交易方式：</p> <ul><li><p>Go组织里边的节点同意， 即可完成</p> <p>OR （go组织.成员）</p> <p>​	组织ID.member</p></li> <li><p>Cpp组织里边的节点同意， 即可完成</p> <p>OR（cpp组织.成员）</p></li> <li><p>Go组织和Cpp组织里边的节点同意， 即可完成</p> <p>AND (go组织.成员, cpp组织.成员)</p></li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 链码的初始化, 只需要做一次</span>
$ peer chaincode instantiate <span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	<span class="token variable"><span class="token variable">`</span>-o, --orderer: orderer节点的地址
	<span class="token variable">`</span></span>-C，--channelID：当前命令运行的通道，默认值是“testchainid<span class="token string">&quot;。
	<span class="token variable"><span class="token variable">`</span>-c, --ctor：JSON格式的构造参数，默认值是“<span class="token punctuation">{</span><span class="token punctuation">}</span>&quot;
	<span class="token variable">`</span></span>-l，--lang：编写Chaincode的编程语言，默认值是golang
	<span class="token variable"><span class="token variable">`</span>-n，--name：Chaincode的名字。
	<span class="token variable">`</span></span>-P，--policy：当前Chaincode的背书策略。
	<span class="token variable"><span class="token variable">`</span>-v，--version：当前操作的Chaincode的版本，适用于install/instantiate/upgrade等命令
	<span class="token variable">`</span></span>--tls: 通信时是否使用tls加密
	`--cafile: 当前orderer节点pem格式的tls证书文件, 要使用绝对路径.
 $ peer chaincode instantiate -o orderer.itcast.com:7050 -C itcastchannel -l golang -n itcastcc -v v1.0 --tls true --cafile <span class="token variable">$CAFILE</span> -P &quot;</span>AND <span class="token punctuation">(</span><span class="token string">'OrgGoMSP.member'</span>, <span class="token string">'OrgCppMSP.member'</span><span class="token punctuation">)</span><span class="token string">&quot; -c '{&quot;</span>Args<span class="token string">&quot;:[&quot;</span>init<span class="token string">&quot;, &quot;</span>a<span class="token string">&quot;, &quot;</span><span class="token number">100</span><span class="token string">&quot;, &quot;</span>b<span class="token string">&quot;, &quot;</span><span class="token number">200</span><span class="token string">&quot;]}'
   - init -&gt; 链码中的初始化函数
   - &quot;</span>a<span class="token string">&quot;, &quot;</span><span class="token number">100</span><span class="token string">&quot;, &quot;</span>b<span class="token string">&quot;, &quot;</span><span class="token number">200</span><span class="token string">&quot; -&gt; init函数的参数
   - 链码中的操作:
     &quot;</span>a<span class="token string">&quot;:100
     &quot;</span>b<span class="token string">&quot;:200
     将这两个数据写入账本中
     
CAFILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem
peer chaincode instantiate -o orderer.itcast.com:7050 -C testchannel -l golang -n testcc -v 1.0 --tls true --cafile <span class="token variable">$CAFILE</span> -P &quot;</span>AND <span class="token punctuation">(</span><span class="token string">'OrgGoMSP.member'</span>, <span class="token string">'OrgCppMSP.member'</span><span class="token punctuation">)</span><span class="token string">&quot; -c '{&quot;</span>Args<span class="token string">&quot;:[&quot;</span>init<span class="token string">&quot;, &quot;</span>a<span class="token string">&quot;, &quot;</span><span class="token number">100</span><span class="token string">&quot;, &quot;</span>b<span class="token string">&quot;, &quot;</span><span class="token number">200</span>&quot;<span class="token punctuation">]</span><span class="token punctuation">}</span>'     
</code></pre></div><h3 id="_4-6-查询"><a href="#_4-6-查询" class="header-anchor">#</a> 4.6 查询</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer chaincode query <span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	<span class="token variable"><span class="token variable">`</span>-n，--name：Chaincode的名字。
	<span class="token variable">`</span></span>-C，--channelID：当前命令运行的通道，默认值是“testchainid<span class="token string">&quot;
	`-c, --ctor：JSON格式的构造参数，默认值是“{}&quot;</span>
	-x，--hex：是否对输出的内容进行编码处理
	-r，--raw：是否输出二进制内容
	-t, --tid: 指定当前查询的编号
$ peer chaincode query -n itcastcc -C itcastchannel -c <span class="token string">'{&quot;Args&quot;:[&quot;query&quot;, &quot;a&quot;]}'</span>
</code></pre></div><h3 id="_4-7-交易"><a href="#_4-7-交易" class="header-anchor">#</a> 4.7 交易</h3> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer chaincode invoke <span class="token punctuation">[</span>flags<span class="token punctuation">]</span>, 常用参数为:
	<span class="token variable"><span class="token variable">`</span>-o, --orderer: orderer节点的地址
	<span class="token variable">`</span></span>-C，--channelID：当前命令运行的通道，默认值是“testchainid<span class="token string">&quot;
	<span class="token variable"><span class="token variable">`</span>-c, --ctor：JSON格式的构造参数，默认值是“<span class="token punctuation">{</span><span class="token punctuation">}</span>&quot;
	<span class="token variable">`</span></span>-n，--name：Chaincode的名字
	<span class="token variable"><span class="token variable">`</span>--tls: 通信时是否使用tls加密
	<span class="token variable">`</span></span>--cafile: 当前orderer节点pem格式的tls证书文件, 要使用绝对路径.
	<span class="token variable"><span class="token variable">`</span>--peerAddresses: 指定要连接的peer节点的地址
	<span class="token variable">`</span></span>--tlsRootCertFiles: 连接的peer节点的TLS根证书, 必须是绝对路径
# 连接的peer节点的TLS根证书查找路径参考:
/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/ca.crt
# example
# -c '{&quot;</span>Args<span class="token string">&quot;:[&quot;</span>invoke<span class="token string">&quot;,&quot;</span>a<span class="token string">&quot;,&quot;</span>b<span class="token string">&quot;,&quot;</span><span class="token number">10</span><span class="token string">&quot;]}'
ROORCERT1=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/ca.crt
ROORCERT2=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer1.orgcpp.itcast.com/tls/ca.crt
$ peer chaincode invoke -o orderer.itcast.com:7050 --tls true --cafile <span class="token variable">$CAFILE</span> -C itcastchannel -n itcastcc -c '{&quot;</span>Args<span class="token string">&quot;:[&quot;</span>invoke<span class="token string">&quot;,&quot;</span>a<span class="token string">&quot;,&quot;</span>b<span class="token string">&quot;,&quot;</span><span class="token number">10</span><span class="token string">&quot;]}' --peerAddresses peer0.orggo.itcast.com:7051 --tlsRootCertFiles <span class="token variable">$ROORCERT1</span> --peerAddresses peer1.orgcpp.itcast.com:7051 --tlsRootCertFiles <span class="token variable">$ROORCERT2</span>

# 因为只给一个节点安装了链码
Error: error endorsing invoke: rpc error: code = Unknown desc = access denied: channel [itcastchannel] creator org [OrgGoMSP] - proposal response: &lt;nil&gt;

CAFILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem
ROORCERT1=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/ca.crt
ROORCERT2=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer0.orgcpp.itcast.com/tls/ca.crt
peer chaincode invoke -o orderer.itcast.com:7050 --tls true --cafile <span class="token variable">$CAFILE</span> -C testchannel -n testcc -c '{&quot;</span>Args<span class="token string">&quot;:[&quot;</span>invoke<span class="token string">&quot;,&quot;</span>a<span class="token string">&quot;,&quot;</span>b<span class="token string">&quot;,&quot;</span><span class="token number">10</span>&quot;<span class="token punctuation">]</span><span class="token punctuation">}</span>' --peerAddresses peer0.orggo.itcast.com:7051 --tlsRootCertFiles <span class="token variable">$ROORCERT1</span> --peerAddresses peer0.orgcpp.itcast.com:7051 --tlsRootCertFiles <span class="token variable">$ROORCERT2</span>
</code></pre></div><h2 id="_5-通过客户端切换操作的节点"><a href="#_5-通过客户端切换操作的节点" class="header-anchor">#</a> 5. 通过客户端切换操作的节点</h2> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 看docker-compose 配置文件中关于 客户端容器的设置 -&gt; 环境变量</span>
- <span class="token assign-left variable">CORE_PEER_ADDRESS</span><span class="token operator">=</span>peer0.orggo.itcast.com:7051 <span class="token comment"># 客户端连接的peer节点</span>
- <span class="token assign-left variable">CORE_PEER_LOCALMSPID</span><span class="token operator">=</span>OrgGoMSP
- <span class="token assign-left variable">CORE_PEER_TLS_ENABLED</span><span class="token operator">=</span>true
- <span class="token assign-left variable">CORE_PEER_TLS_CERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/server.crt
- <span class="token assign-left variable">CORE_PEER_TLS_KEY_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/server.key
- <span class="token assign-left variable">CORE_PEER_TLS_ROOTCERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/ca.crt
- <span class="token assign-left variable">CORE_PEER_MSPCONFIGPATH</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/users/Admin@orggo.itcast.com/msp
</code></pre></div><ul><li><p>go组织的peer0</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_ADDRESS</span><span class="token operator">=</span>peer0.orggo.itcast.com:7051
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_LOCALMSPID</span><span class="token operator">=</span>OrgGoMSP
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_MSPCONFIGPATH</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/users/Admin@orggo.itcast.com/msp
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_ROOTCERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/ca.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_CERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/server.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_KEY_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/tls/server.key
</code></pre></div></li> <li><p>go组织的peer1</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_ADDRESS</span><span class="token operator">=</span>peer1.orggo.itcast.com:7051
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_LOCALMSPID</span><span class="token operator">=</span>OrgGoMSP
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_MSPCONFIGPATH</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/users/Admin@orggo.itcast.com/msp
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_ROOTCERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer1.orggo.itcast.com/tls/ca.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_CERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer1.orggo.itcast.com/tls/server.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_KEY_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orggo.itcast.com/peers/peer1.orggo.itcast.com/tls/server.key
</code></pre></div></li> <li><p>cpp组织的peer0</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_ADDRESS</span><span class="token operator">=</span>peer0.orgcpp.itcast.com:7051
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_LOCALMSPID</span><span class="token operator">=</span>OrgCppMSP
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_MSPCONFIGPATH</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/users/Admin@orgcpp.itcast.com/msp
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_ROOTCERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer0.orgcpp.itcast.com/tls/ca.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_CERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer0.orgcpp.itcast.com/tls/server.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_KEY_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer0.orgcpp.itcast.com/tls/server.key
</code></pre></div></li> <li><p>cpp组织的peer1</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_ADDRESS</span><span class="token operator">=</span>peer1.orgcpp.itcast.com:7051
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_LOCALMSPID</span><span class="token operator">=</span>OrgCppMSP
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_MSPCONFIGPATH</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/users/Admin@orgcpp.itcast.com/msp
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_ROOTCERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer1.orgcpp.itcast.com/tls/ca.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_CERT_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer1.orgcpp.itcast.com/tls/server.crt
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_TLS_KEY_FILE</span><span class="token operator">=</span>/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.itcast.com/peers/peer1.orgcpp.itcast.com/tls/server.key
</code></pre></div></li></ul></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">7/20/2020, 2:09:44 AM</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev">
      ←
      <a href="/go-block/blockchain/hyperledgerfabric.html" class="prev">hyperledger fabric</a></span> <span class="next"><a href="/go-block/fabric/1环境搭建.html">1环境搭建</a>
      →
    </span></p></div> </main></div><div class="global-ui"></div></div>
    <script src="/assets/js/app.cb35c8f6.js" defer></script><script src="/assets/js/2.063846a6.js" defer></script><script src="/assets/js/4.1ffb4609.js" defer></script><script src="/assets/js/50.9df07553.js" defer></script>
  </body>
</html>
